SpringMVC實現檔案下載的兩種方式及多檔案下載
阿新 • • 發佈:2019-01-08
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