写在前面:
如本文描述有错误,希望读到这篇文章的您能够提出批评指正。 联系方式:172310978@qq.com
参考文章:
- https://blog.51cto.com/u_12192/6442520
思路
批量下载文件时,需要将多个文件打包为zip,然后再下载。实现思路有两种:一是将所有文件先打包压缩为一个文件,然后下载这个压缩包,二是一边压缩一边下载,将多个文件逐一写入到压缩文件中。
实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| @ResponseBody public void downloadFiles(HttpServletRequest request, HttpServletResponse response, 其他为获取下载文件信息的必须参数){ //响应头的设置 response.reset(); response.setCharacterEncoding("utf-8"); response.setContentType("multipart/form-data"); //设置压缩包的名字 //解决不同浏览器压缩包名字含有中文时乱码的问题 String downloadName = "我是压缩包的名字.zip"; String agent = request.getHeader("USER-AGENT"); try { if (agent.contains("MSIE")||agent.contains("Trident")) { downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8"); } else { downloadName = new String(downloadName.getBytes("UTF-8"),"ISO-8859-1"); } } catch (Exception e) { e.printStackTrace(); } response.setHeader("Content-Disposition", "attachment;fileName=\"" + downloadName + "\""); //设置压缩流:直接写入response,实现边压缩边下载 ZipOutputStream zipos = null; try { zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream())); zipos.setMethod(ZipOutputStream.DEFLATED); //设置压缩方法 } catch (Exception e) { e.printStackTrace(); } //循环将文件写入压缩流 DataOutputStream os = null; for(int i = 0; i < 要下载的文件个数; i++ ){ File file = new File(要下载的某个文件的路径); try { //添加ZipEntry,并ZipEntry中写入文件流 //这里,加上i是防止要下载的文件有重名的导致下载失败 zipos.putNextEntry(new ZipEntry(i + 文件名字)); os = new DataOutputStream(zipos); InputStream is = new FileInputStream(file); byte[] b = new byte[100]; int length = 0; while((length = is.read(b))!= -1){ os.write(b, 0, length); } is.close(); zipos.closeEntry(); } catch (IOException e) { e.printStackTrace(); } } //关闭流 try { os.flush(); os.close(); zipos.close(); } catch (IOException e) { e.printStackTrace(); } }
@ResponseBody public void downloadFiles(HttpServletRequest request, HttpServletResponse response, 其他为获取下载文件信息的必须参数){ //响应头的设置 response.reset(); response.setCharacterEncoding("utf-8"); response.setContentType("multipart/form-data"); //设置压缩包的名字 //解决不同浏览器压缩包名字含有中文时乱码的问题 String downloadName = "我是压缩包的名字.zip"; String agent = request.getHeader("USER-AGENT"); try { if (agent.contains("MSIE")||agent.contains("Trident")) { downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8"); } else { downloadName = new String(downloadName.getBytes("UTF-8"),"ISO-8859-1"); } } catch (Exception e) { e.printStackTrace(); } response.setHeader("Content-Disposition", "attachment;fileName=\"" + downloadName + "\""); //设置压缩流:直接写入response,实现边压缩边下载 ZipOutputStream zipos = null; try { zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream())); zipos.setMethod(ZipOutputStream.DEFLATED); //设置压缩方法 } catch (Exception e) { e.printStackTrace(); } //循环将文件写入压缩流 DataOutputStream os = null; for(int i = 0; i < 要下载的文件个数; i++ ){ File file = new File(要下载的某个文件的路径); try { //添加ZipEntry,并ZipEntry中写入文件流 //这里,加上i是防止要下载的文件有重名的导致下载失败 zipos.putNextEntry(new ZipEntry(i + 文件名字)); os = new DataOutputStream(zipos); InputStream is = new FileInputStream(file); byte[] b = new byte[100]; int length = 0; while((length = is.read(b))!= -1){ os.write(b, 0, length); } is.close(); zipos.closeEntry(); } catch (IOException e) { e.printStackTrace(); } } //关闭流 try { os.flush(); os.close(); zipos.close(); } catch (IOException e) { e.printStackTrace(); } }
|
以上代码,在chrome/firefox/ie
下都可以正常下载。
本文转自 https://blog.51cto.com/u_12192/6442520,如有侵权,请联系删除。