Two Ways to Realize File Download in Spring MVC

Posted by imcookie on Thu, 03 Oct 2019 21:39:17 +0200

This article is reproduced from Asher 1 - CSDN Original link
1. Conventional methods

@RequestMapping("/download")
	public String download( String fileName ,String filePath, HttpServletRequest request, HttpServletResponse response){
				 
		response.setContentType("text/html;charset=utf-8");
		try {
			request.setCharacterEncoding("UTF-8");
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
				
		java.io.BufferedInputStream bis = null;
		java.io.BufferedOutputStream bos = null;
	
		String downLoadPath = filePath;  //Note the separators for different systems
	//	String downLoadPath = filePath. replaceAll ("/", "\\\\\\\\\\\\*  
		System.out.println(downLoadPath);
		
		try {
			long fileLength = new File(downLoadPath).length();
			response.setContentType("application/x-msdownload;");
			response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("utf-8"), "ISO8859-1"));
			response.setHeader("Content-Length", String.valueOf(fileLength));
			bis = new BufferedInputStream(new FileInputStream(downLoadPath));
			bos = new BufferedOutputStream(response.getOutputStream());
			byte[] buff = new byte[2048];
			int bytesRead;
			while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
				bos.write(buff, 0, bytesRead);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (bis != null)
				try {
					bis.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			if (bos != null)
				try {
					bos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}
		return null;	
	}

2. Using the ResponseEntity type provided by spring mvc, it is easy to define the returned HttpHeaders and HttpStatus.

RequestMapping("/download")  
	    public ResponseEntity<byte[]> export(String fileName,String filePath) throws IOException {  
	    	
	        HttpHeaders headers = new HttpHeaders();    
	        File file = new File(filePath);
	        
	        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);    
	        headers.setContentDispositionFormData("attachment", fileName);    
	       
	        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),    
	                                              headers, HttpStatus.CREATED);    
	    } 

Another point to note
ajax request can not respond to download function because of response, generally request browser will handle server output response, such as generating png, file download, etc., but ajax request is only a "character" request, that is, the content of the request is stored in text type. The download of files is in binary form. Although the response returned can be read, it can only be read. It can not be executed. The white point is that js can not call the download processing mechanism and program of browser.

It is recommended that you build your own form for submission in this way

var form = $("<form>");
form.attr("style","display:none");
form.attr("target","");
form.attr("method","post");
form.attr("action",rootPath + "T_academic_essay/DownloadZipFile.do");
var input1 = $("<input>");
input1.attr("type","hidden");
input1.attr("name","strZipPath");
input1.attr("value",strZipPath);
$("body").append(form);
form.append(input1);
form.submit();
form.remove();

--------
Copyright Statement: This article is the original article of CSDN blogger Asher1. It follows CC 4.0 BY-SA Copyright Agreement. Please attach the link of origin and this statement for reproducing.
Links to the original text: https://blog.csdn.net/a447332241/article/details/78998239

Topics: Java Spring