1. 程式人生 > >SpringMVC實現檔案下載的兩種方式及多檔案下載

SpringMVC實現檔案下載的兩種方式及多檔案下載

1.傳統方法

    @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;  //注意不同系統的分隔符
		//	String downLoadPath =filePath.replaceAll("/", "\\\\\\\\");   //replace 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.利用springmvc提供的ResponseEntity型別,使用它可以很方便地定義返回的HttpHeaders和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);    
	    } 

 3、多檔案下載[2]

主要先下載到本地,並新增到壓縮檔案中,再讀取壓縮檔案到陣列中,而後將陣列返回前臺返回前臺

//批量檔案壓縮後下載
	@RequestMapping("/downLoad2")
	public ResponseEntity<byte[]> download2(HttpServletRequest request) throws IOException {
		
		//需要壓縮的檔案
		List<String> list = new ArrayList<String>();
		list.add("test.txt");
		list.add("test2.txt");
		
		//壓縮後的檔案
		String resourcesName = "test.zip";
		
		ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream("D:/"+resourcesName));
		InputStream input = null;
		
		for (String str : list) {
			String name = "D:/"+str;
			input = new FileInputStream(new File(name));  
            zipOut.putNextEntry(new ZipEntry(str));  
            int temp = 0;  
            while((temp = input.read()) != -1){  
                zipOut.write(temp);  
            }  
            input.close();
		}
		zipOut.close();
		File file = new File("D:/"+resourcesName);
		HttpHeaders headers = new HttpHeaders();
		String filename = new String(resourcesName.getBytes("utf-8"),"iso-8859-1");
		headers.setContentDispositionFormData("attachment", filename);
		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
		return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED);
	}

另外需要注意的一點

ajax請求無法響應下載功能因為response原因,一般請求瀏覽器是會處理伺服器輸出的response,例如生成png、檔案下載等,然而ajax請求只是個“字元型”的請求,即請求的內容是以文字型別存放的。檔案的下載是以二進位制形式進行的,雖然可以讀取到返回的response,但只是讀取而已,是無法執行的,說白點就是js無法呼叫到瀏覽器的下載處理機制和程式。

推薦使用這種方式 自己構建表單進行提交

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();

原文出處:

[1] panpanpan_, SpringMVC實現檔案下載的兩種方式, https://blog.csdn.net/a447332241/article/details/78998239

[2] qq_33422712, SpringMvc 下載和批量下載, https://blog.csdn.net/qq_33422712/article/details/79142350