文件下载时,我们可能需要一次下载多个文件。批量下载文件时,需要将多个文件打包为zip,然后再下载。实现思路有两种:一是将所有文件先打包压缩为一个文件,然后下载这个压缩包,二是一边压缩一边下载,将多个文件逐一写入到压缩文件中。我这里实现了边压缩边下载。

下载样式:

点击下载按钮,会弹出下载框:

下载后就有一个包含刚刚选中的两个文件:

代码实现:

FileBean

public class FileBean implements Serializable {private Integer fileId;// 主键private String filePath;// 文件保存路径private String fileName;// 文件保存名称public FileBean() {}public Integer getFileId() {return fileId;}public void setFileId(Integer fileId) {this.fileId = fileId;}public String getFilePath() {return filePath;}public void setFilePath(String filePath) {this.filePath = filePath;}public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}}

控制层:

@RequestMapping(value = "/download", method = RequestMethod.GET)public String download(String id, HttpServletRequest request,HttpServletResponse response) throws IOException {String str = "";if (id != null && id.length() != 0) {int index = id.indexOf("=");str = id.substring(index + 1);String[] ids = str.split(",");ArrayList<FileBean> fileList = new ArrayList<FileBean>();for (int i = 0; i < ids.length; i++) {// 根据id查找genericFileUpload,得到文件路径以及文件名GenericFileUpload genericFileUpload = new GenericFileUpload();genericFileUpload = genericFileUploadService.find(Long.parseLong(ids[i]));FileBean file = new FileBean();file.setFileName(genericFileUpload.getFileName());file.setFilePath(genericFileUpload.getFilePath());fileList.add(file);}//设置压缩包的名字//解决不同浏览器压缩包名字含有中文时乱码的问题String zipName = "download.zip";response.setContentType("APPLICATION/OCTET-STREAM");response.setHeader("Content-Disposition", "attachment; filename="+ zipName);//设置压缩流:直接写入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<fileList.size();i++){String filePath=fileList.get(i).getFilePath();String fileName=fileList.get(i).getFileName();File file=new File(filePath+"/"+fileName);//要下载文件的路径try{//添加ZipEntry,并ZipEntry中写入文件流//这里,加上i是防止要下载的文件有重名的导致下载失败zipos.putNextEntry(new ZipEntry(i+fileName));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(Exception e){e.printStackTrace();}}//关闭流try {os.flush();os.close();zipos.close();} catch (IOException e) {e.printStackTrace();}         }return "redirect:list.jhtml";}

java web 实现多个文件压缩下载相关推荐

  1. Java Web实现 使用浏览器从服务器下载文件

    Java Web实现 使用浏览器从服务器下载文件. 代码实现: package com.juneyaoair.util;import lombok.SneakyThrows;import javax. ...

  2. Java多文件压缩下载解决方案

    Java多文件压缩下载解决方案 需求: 会员运营平台经过改版后页面增加了许多全部下载链接,上周上线比较仓促,全部下载是一个直接下载ZIP压缩文件的链接,每个ZIP压缩文件都是由公司运营人员将页面需要下 ...

  3. java实现下载压缩文件_java实现文件压缩下载----压缩下载zip

    文件压缩下载 Controller层: /** *文件压缩下载 *billname:文件名 *filename:文件存放路径 */ public void downloadsource(HttpSer ...

  4. java实现文件压缩下载----压缩下载zip

    文件压缩下载 Controller层: /** *文件压缩下载 *billname:文件名 *filename:文件存放路径 */ public void downloadsource(HttpSer ...

  5. java实现文件压缩下载

    文件压缩下载 package com.ruoyi.utils; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.uti ...

  6. 批量文件压缩下载(zip)

    ps:工作之余仅留备份用,未全面完善,请按需取用 一.主要关注两点:1.找到文件并压缩:2.通过文件输出流响应前端 @RestController @RequestMapping("/fil ...

  7. IntelliJ IDEA 中的Java Web项目的资源文件复制新增如何更新到部署包中?

    文章目录 resources目录下的文件复制新增 webapp目录的文件复制新增 IntelliJ IDEA 中的Java Web项目的资源文件如果复制新增,正常的重新部署.重启服务器.update ...

  8. php excel模板导出、openoffice excel转pdf、多文件压缩下载

    最近两周都在弄关于excel模板导出.excel转pdf.多文件压缩下载.弄得头都大了,接下来说说实现的方法吧. 我用的是laravel5.1的框架,读取模板生成excel,并且插入图片,直接上代码 ...

  9. Java多线程实现多文件压缩下载

    1.java多线程通过多个路径压缩为一个zip文件 import lombok.Data; import org.springframework.util.CollectionUtils; impor ...

最新文章

  1. Leetcode - Subsets I,II
  2. Linux环境安装zookeeper3.5.5后,总是启动不了
  3. python-if条件判断与while/for循环
  4. RMI和WebService
  5. More Effective C++ (限制类的对象数量)
  6. MYSQL 的集群
  7. java向kafka推送数据_Java编写程序将数据存入Kafka中
  8. 中国天然驱蚊剂行业市场供需与战略研究报告
  9. 20190904:(leetcode习题)合并两个有序数组
  10. python3怎么安装opencv_Python:即使安装了opencv,也无法导入cv2(如何为python3安装opencv3)...
  11. MySQL 5.7主从复制从零开始设置及全面详解——实现多线程并行同步,解决主从复制延迟问题!...
  12. python数字图像处理(9):直方图与均衡化
  13. 第 25 章 基于小波变换的数字水印技术
  14. adb 版本更新后执行依旧是旧版本解决方法
  15. 2022蓝桥杯——砍竹子
  16. python函数def无效_python自定义函数def的应用详解
  17. 【项目管理】测量绩效域管理
  18. 实用的Word文档翻译方法分享,让Word文档快速翻译
  19. uni-app学习 style样式和三元运算符用法(三)
  20. 四色问题:证明、推广和应用

热门文章

  1. 计算机通识之信息编码(一)
  2. java代码发送http post请求
  3. 组合机床滑台动态特性的研究 英文翻译
  4. matlab如何模拟转子断条,转子断条故障案例分析
  5. 佳能Canon i865 打印机驱动
  6. CDN技术之--全局负载均衡(GSLB)
  7. CocosCreator 中的摇杆
  8. python初级 奶茶店自助结算系统的基本代码
  9. 使用vscode,控制台显示“无法初始化设备 PRN”的解决方法
  10. 相对论通俗易懂理解版