最近在做一个管理系统的项目,需要实现一个功能,就是批量下载文件,并打包成zip压缩包。
   前端通过POST请求传来要下载的文件列表,Java代码实现如下:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;/**
* @author XXX
* @version 1.0
* @date 2021年10月15日
*/
public class Test {/*** 日志输出对象*/private static Logger logger = LoggerFactory.getLogger(Test.class);/*** 文件路径  举例:D:\data\test\file\*/@Value("${path}")private String path;/*** 文件下载** @param param* @return*/@RequestMapping(value = "/test/downloadfile.action", method = RequestMethod.POST)@ResponseBodypublic void downloadFile(@RequestBody String param,HttpServletRequest request, HttpServletResponse response) {OutputStream os = null;ZipOutputStream zos = null;BufferedInputStream bis = null;FileInputStream in = null;   try {ObjectMapper objectMapper = new ObjectMapper();JsonNode root = objectMapper.readTree(param);if (root != null) {JsonNode dataNode = root.findValue("fileNameList");List<String> fileNameList = objectMapper.readValue(dataNode.toString(), new TypeReference<List<String>>(){});// 通过response对象获取OutputStream流os = response.getOutputStream();// 获取zip的输出流zos = new ZipOutputStream(os);// 遍历文件名列表添加进压缩包for (int i = 0; i < fileNameList.size(); i++) {String fileName = fileNameList.get(i);String filePath = path + fileName;File file = new File(filePath);if (file.exists()) {// 读取文件流in = new FileInputStream(file);// 创建ZIP实体,并添加进压缩包ZipEntry zipEntry = new ZipEntry(fileName);zos.putNextEntry(zipEntry);// 设置压缩后的文件名String zipFileName = "dataFile.zip";// 设置Content-Disposition响应头,控制浏览器弹出保存框,若没有此句浏览器会直接打开并显示文件// 中文名要进行URLEncoder.encode编码,否则客户端能下载但名字会乱码response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipFileName, "UTF-8"));// 输入缓冲流bis = new BufferedInputStream(in, 1024 * 10);// 创建读写缓冲区byte[] buf = new byte[1024 * 10];int len = 0;while ((len = bis.read(buf, 0, 1024 * 10)) > 0) {// 使用OutputStream将缓冲区的数据输出到客户端浏览器zos.write(buf, 0, len);}bis.close();in.close();zos.closeEntry();}}}} catch (Exception e) {logger.error("下载文件异常:" + e.toString());} finally {try {if(null != bis){bis.close();} if(null != in){in.close();}if(null != zos){zos.close();}if(null != os){os.close();}} catch (Exception e2) {logger.error(e2.toString());}}}
}

   有些同学会遇到下载下来文件解压报错的情况,一定要检查流是否关闭,流关闭一定要用close(),closeEntry()关闭是针对往压缩文件写入实体,同时要排查流的关闭顺序是否正确,先打开的流,最后关闭。

Java实现文件批量下载,打包成zip压缩包相关推荐

  1. 多文件批量下载打包成.zip

    多文件批量下载打包成.zip //下载文件打包成zip压缩包@GetMapping("/zip/{id}")public void zip(@PathVariable(" ...

  2. java文件批量下载打包成zip

    1.首先html页面获取当前需要下载文件的id集合将转成字符串形式传递到后台. ................ 2 .下面就是获取字符串之后的批量下载/*** 多文件批量下载压缩成zip**root ...

  3. EasyExcel3.0.5 导出多个sheet,批量下载打包成ZIP压缩包

    多sheet导出并批量下载附件 前言 源码 代码实现 Controller 接口类 实现类 (重中之重) 实现类重点强调 测试 结语 前言 最近浏览语雀社区官网,里面有一篇 easyexcel 里面 ...

  4. Java实现批量下载(打包成zip)

    批量下载 引言 一.前端JS发送下载请求 1.ajax无法发送下载请求 2.js发送下载请求:超链接方式 3.js发送下载请求:拼接Form表单,并提交 二.后台处理 三.结束 引言 批量下载思路,首 ...

  5. 【java】 文件批量下载并压缩为zip压缩包

    [java] 文件批量下载并压缩为zip压缩包 java常用的压缩技术 java中常见实现压缩与解压 业务场景 代码实现 注意点 java常用的压缩技术 常见的压缩格式有很多种,例如:zip.rar. ...

  6. 使用filemanager-webpack-plugin将前端项目打包成zip压缩包

    使用filemanager-webpack-plugin插件将前端的dist目录打包成zip压缩包,省去手动压缩,进一步可以配合 idea 的Cloud Toolkit插件 或者jekenis进行自动 ...

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

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

  8. 使用 easyExcel 生成多个 excel 并打包成zip压缩包

    前言: 最近项目有个需求,需要生成多个 excel 并打包成 zip下载:由于需要生成的 excel 头字段过多,这里有96个时间段的表头,如果建一个有96个字段的实体不太好,还好 easyExcel ...

  9. java 批量下载图片并打包成zip压缩包

    项目需求: 对接第三方接口时,因为数据中存储的是图片链接,第三方审核时需要把所有图片以zip压缩包的方式传入到他们ftp服务中. 提示:以下是本篇文章正文内容,下面案例可供参考 话不多说直接看代码,案 ...

最新文章

  1. WORD 排版十技巧
  2. 虚拟机Linux下解决ping时出现 unknown host问题
  3. iis应用程序池监控方法实例
  4. linux获取随机数的方法集合
  5. Java8基础之super关键字
  6. 计算机组成原理树状图,数据结构
  7. 写几个函数 输入10个职工的姓名和职工号_Excel函数速查一览表-函数应用案例-信息统计(2)...
  8. Framework4.5,vs下系统自动生成的C++ win32应用程序的详细解释
  9. 机器学习笔记(二十九):决策树、信息熵
  10. FlexDisPlayRoom正在发货「可在线玩弄」
  11. 扫码枪扫描多个二维码在明细行自动增行自动定位输入框
  12. Spring Boot微服务API网关
  13. 计算机ms一级分数分配,计算机一级六大MS题型介绍
  14. Unity 分辨率框Config Dialog Banner尺寸要求
  15. 深入理解wifi direct
  16. SpringBoot项目部署到Tomcat中的两种方式(jar和war)
  17. 《醒悟》中“TOC”在零售业是如何应用的?
  18. 每日一题——二叉树的中序遍历
  19. win7创建任务计划:自动关机命令
  20. [原创]持续给力:jQuery实现表格隔行变色效果案例详解

热门文章

  1. Android挂逼修练之行---微信中把朋友圈封面设置成酷炫视频功能插件开发详解
  2. 华为和华三模拟器大全
  3. Sencha touch 2.0 + phone gap 1.2 + android 4.0 集成
  4. python爬虫实践--晋江小说书籍分析
  5. 解决layui使用定时器对table数据重载导致页面闪烁的问题
  6. Webupload+PHP上传大文件
  7. 物联网开发平台大 PK
  8. python实现回合制对战游戏-面向对象编程
  9. Golang http get Content-Encoding:deflate 问题
  10. 初学者学习编程,如何训练自己的编程思维,资深程序员这样建议