1、需求场景

平时我们开发web应用时可能会遇到用户在界面选择下载多个报表,点击下载按钮后需要批量下载这些文件到浏览器。但是一般情况下,页面一次点击只能触发一个文件的下载,所以无法实现上述诉求。

2、解决方案

针对上述的问题我们可以借助java.util.zip.ZipOutputStream这个类来实现该功能,具体的我们可以使用该类将多个报表文件压缩到一个zip包中,然后将这个zip包写回到浏览器。

3、代码实现

3.1、zip压缩代码

 /*** * @param files  需要压缩的文件列表* @param zipFile  压缩后的文件*/public static void ZipMultiFile(List<File> files, File zipFile) {try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile))) {for (File file : files) {try (FileInputStream fis = new FileInputStream(file);) {zipOut.putNextEntry(new ZipEntry(file.getName()));int temp;byte[] buf = new byte[1024];while ((temp = fis.read(buf)) != -1) {zipOut.write(buf, 0, temp);}zipOut.closeEntry();zipOut.flush();} catch (Exception ex) {ex.printStackTrace();}}} catch (Exception e) {e.printStackTrace();}}

3.2、zip压缩文件写回浏览器代码

 /*** 多文件下载* @param files* @param zipFile* @param response*/public static void multiDownload(List<File> files,File zipFile,HttpServletResponse response) {response.reset();// 设置response的Headerresponse.setCharacterEncoding("UTF-8");//Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存//attachment表示以附件方式下载 inline表示在线打开 "Content-Disposition: inline; filename=文件名.mp3"// filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称try {response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipFile.getName(), "UTF-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}// 告知浏览器文件的大小//设置响应格式,已文件流的方式返回给前端。response.setContentType("application/octet-stream");//生成压缩文件ZipMultiFile(files, zipFile);response.addHeader("Content-Length", String.valueOf(zipFile.length()));try (ServletOutputStream sos = response.getOutputStream();BufferedInputStream bis = new BufferedInputStream(new FileInputStream(zipFile))) {byte[] buff = new byte[1024 * 10];int index;while ((index = bis.read(buff, 0, buff.length)) != -1) {sos.write(buff, 0, index);}sos.flush();} catch (Exception e) {e.printStackTrace();}}

使用ZipOutputStream实现web端批量下载文件到浏览器相关推荐

  1. web前端批量下载文件和图片探索

    1.图片,文件批量下载(不跨域的情况下) import JSZip from 'jszip'; import {saveAs} from 'file-saver'; import axios from ...

  2. JAVA 批量下载文件

    最近项目有个需求,用户想对挂有附件的数据记录 实现一键下载全部附件(目前项目仅支持每次点击单条记录进行附件下载),下面记录我实现的解决方案. 项目框架基于SSM service业务实现层(impl): ...

  3. 批量下载文件的设备和方法

    申请日期:2014年11月20日 申请人:北京安奇智联科技有限公司 [摘要] 本发明公开了一种驻留在移动终端中的批量下载文件的设备和方法.移动终端能够通过服务器与计算设备的浏览器相连.该批量下载文件的 ...

  4. java批量下载文件为zip包

    批量下载文件为zip包的工具类 package com.meeno.trainsys.util;import javax.servlet.http.HttpServletRequest; import ...

  5. 批量下载文件,打包成zip压缩包

    批量下载文件,用程序打成zip压缩包在下载 前台传来要下载的url数组 @RequestMapping(value = "/download",method = RequestMe ...

  6. python批量下载文件-Python实现批量下载文件

    Python实现批量下载文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from gevent import monkey monkey.patch_a ...

  7. python批量下载网页文件-Python实现批量下载文件

    Python实现批量下载文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from gevent import monkey monkey.patch_a ...

  8. mysql 线程池 下载_java线程池实现批量下载文件

    本文实例为大家分享了java线程池实现批量下载文件的具体代码,供大家参考,具体内容如下 1 创建线程池 package com.cheng.webb.thread; import java.util. ...

  9. php批量下载TXT中的URL,需求是这样,再不改变目录结构的前提下,通过URL,批量下载文件,我已经写好了一点儿了...

    //需求是这样,再不改变目录结构的前提下,通过URL,批量下载文件,我已经写好了一点儿了 //但是有点bug,只能下载最后一个文件 //邱老师解决一下 $file=fopen("q.txt& ...

最新文章

  1. Environ. Res.:南土所梁玉婷组-低砷稻田土壤微生物抗砷功能基因的分布模式
  2. 【C 语言】文件操作 ( 配置文件读写 | 框架搭建 | 头文件定义 | 头文件导入限制 | 兼容 C++ 语言 | 函数形参输入输出属性注释)
  3. 使用Decision Tree对MNIST数据集进行实验
  4. Docker Review - 图形化工具 Portainer
  5. 谷歌大脑自门控激活函数Swish
  6. Spring Shell笔记-help方法及exit及其他方法
  7. 安卓加java完成登录_从零学习安卓自动化(java+appium方向):完成登录操作+一个主流程(四)...
  8. (并查集 建立关系)Parity game -- POJ -1733
  9. AngularJS scope 作用域的问题
  10. VS2013 MFC 中DLL链接库断点不能命中的解决方案总结
  11. 百度人脸识别,一次耗时600毫秒
  12. 计算机维修与维护怎么学,做电脑维修需要学习哪些知识呢?
  13. K3 Cloud 常用语法及常见异常
  14. 统计学之假设检验(总体均值、总体比例、总体方差)含例题和解答
  15. docker 常用命令合集
  16. 苹果a14和骁龙888哪个厉害 苹果a14相当于骁龙多少
  17. [附源码]java毕业设计病历管理系统设计
  18. 【李航统计学习方法】感知机模型
  19. 区块链游戏,不懂你别玩!
  20. 制作表白墙,给TA一个惊喜吧

热门文章

  1. ABB机器人搬运码垛/柴垛项目实战案例
  2. Jeff Bezos的深谋远虑成就Amazon今日的霸气外露
  3. 再也不愁渲染素材了?AI 生成3D纹理 #Polycam3D 推出新功能
  4. 2020年上海交通大学全球大学学术排名 ,世界大学排名
  5. “35岁转管理,不写代码感觉心里发虚!” “难道继续写就不虚?”
  6. 2017南京师范大学计算机学院录取名单,重磅!南京师范大学2017年江苏省普通本一录取结果发布...
  7. 用Excel筛选功能实现WPS表格多条件筛选功能
  8. 查询抖音账号关注数点赞数
  9. awk筛nvidia-smi的PID
  10. Android蓝牙Socket通信