使用ZipOutputStream实现web端批量下载文件到浏览器
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端批量下载文件到浏览器相关推荐
- web前端批量下载文件和图片探索
1.图片,文件批量下载(不跨域的情况下) import JSZip from 'jszip'; import {saveAs} from 'file-saver'; import axios from ...
- JAVA 批量下载文件
最近项目有个需求,用户想对挂有附件的数据记录 实现一键下载全部附件(目前项目仅支持每次点击单条记录进行附件下载),下面记录我实现的解决方案. 项目框架基于SSM service业务实现层(impl): ...
- 批量下载文件的设备和方法
申请日期:2014年11月20日 申请人:北京安奇智联科技有限公司 [摘要] 本发明公开了一种驻留在移动终端中的批量下载文件的设备和方法.移动终端能够通过服务器与计算设备的浏览器相连.该批量下载文件的 ...
- java批量下载文件为zip包
批量下载文件为zip包的工具类 package com.meeno.trainsys.util;import javax.servlet.http.HttpServletRequest; import ...
- 批量下载文件,打包成zip压缩包
批量下载文件,用程序打成zip压缩包在下载 前台传来要下载的url数组 @RequestMapping(value = "/download",method = RequestMe ...
- python批量下载文件-Python实现批量下载文件
Python实现批量下载文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from gevent import monkey monkey.patch_a ...
- python批量下载网页文件-Python实现批量下载文件
Python实现批量下载文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from gevent import monkey monkey.patch_a ...
- mysql 线程池 下载_java线程池实现批量下载文件
本文实例为大家分享了java线程池实现批量下载文件的具体代码,供大家参考,具体内容如下 1 创建线程池 package com.cheng.webb.thread; import java.util. ...
- php批量下载TXT中的URL,需求是这样,再不改变目录结构的前提下,通过URL,批量下载文件,我已经写好了一点儿了...
//需求是这样,再不改变目录结构的前提下,通过URL,批量下载文件,我已经写好了一点儿了 //但是有点bug,只能下载最后一个文件 //邱老师解决一下 $file=fopen("q.txt& ...
最新文章
- Environ. Res.:南土所梁玉婷组-低砷稻田土壤微生物抗砷功能基因的分布模式
- 【C 语言】文件操作 ( 配置文件读写 | 框架搭建 | 头文件定义 | 头文件导入限制 | 兼容 C++ 语言 | 函数形参输入输出属性注释)
- 使用Decision Tree对MNIST数据集进行实验
- Docker Review - 图形化工具 Portainer
- 谷歌大脑自门控激活函数Swish
- Spring Shell笔记-help方法及exit及其他方法
- 安卓加java完成登录_从零学习安卓自动化(java+appium方向):完成登录操作+一个主流程(四)...
- (并查集 建立关系)Parity game -- POJ -1733
- AngularJS scope 作用域的问题
- VS2013 MFC 中DLL链接库断点不能命中的解决方案总结
- 百度人脸识别,一次耗时600毫秒
- 计算机维修与维护怎么学,做电脑维修需要学习哪些知识呢?
- K3 Cloud 常用语法及常见异常
- 统计学之假设检验(总体均值、总体比例、总体方差)含例题和解答
- docker 常用命令合集
- 苹果a14和骁龙888哪个厉害 苹果a14相当于骁龙多少
- [附源码]java毕业设计病历管理系统设计
- 【李航统计学习方法】感知机模型
- 区块链游戏,不懂你别玩!
- 制作表白墙,给TA一个惊喜吧
热门文章
- ABB机器人搬运码垛/柴垛项目实战案例
- Jeff Bezos的深谋远虑成就Amazon今日的霸气外露
- 再也不愁渲染素材了?AI 生成3D纹理 #Polycam3D 推出新功能
- 2020年上海交通大学全球大学学术排名 ,世界大学排名
- “35岁转管理,不写代码感觉心里发虚!” “难道继续写就不虚?”
- 2017南京师范大学计算机学院录取名单,重磅!南京师范大学2017年江苏省普通本一录取结果发布...
- 用Excel筛选功能实现WPS表格多条件筛选功能
- 查询抖音账号关注数点赞数
- awk筛nvidia-smi的PID
- Android蓝牙Socket通信