目录

  • 前言
  • 逻辑流程
  • 代码
    • 请求接口
    • 压缩文件方法
    • 关闭文件流

前言

接到个需求,从数据库查询出多个用户,每个用户都会有头像,以压缩包的方式下载这些用户的头像,这里用到了java.util.zip包下的zip工具类。

逻辑流程

  1. 获取前端请求接口和参数。

  2. 查询所有用户头像地址,并使用List<String> filePaths存储。

  3. 调用文件压缩方法。

  4. 写出文件流。

  5. 关闭文件流。

代码

请求接口

/*** 批量导出附件,附件以压缩包的形式下载*/
@RequestMapping(value = "/downZip", method = RequestMethod.GET)
public void downZip(Long projectId, String keyword, HttpServletRequest request, HttpServletResponse response) {requiredCheck(projectId);Map<String, String> map = new HashMap<>();map.put("project.id", projectId.toString());List<CbcAddressBook> books = cbcAddressBookService.baseApiListObj(request, map, null, keyword, null, new String[]{"fileName"}, null).getResultData();List<String> filePaths = new LinkedList<>();for (int i = 0; i < books.size(); i++) {CbcAddressBook book = books.get(i);ifNullThrow(book.getFile(), "第" + (i + 1) + "行话单未上传文件");filePaths.add(getTomcatRootPath() + book.getFile().getRelativePath());}OutputStream out = null;ZipOutputStream zos = null;BufferedInputStream bis = null;try {out = response.getOutputStream();//创建压缩文件需要的空的zip包String zipBasePath = getTomcatRootPath() + "/upload/attachZip /";String zipName = DateUtil.ISO_DATETIME_FORMAT_NONE.format(new Date()) + ".zip";String zipFilePath = zipBasePath + File.separator + zipName;//压缩文件File zip = new File(zipFilePath);if (!zip.exists()) {zip.createNewFile();}//创建zip文件输出流zos = new ZipOutputStream(new FileOutputStream(zip));zipFile(zipBasePath, zipName, zipFilePath, filePaths, zos);zos.close();response.setContentType("text/html; charset=UTF-8"); //设置编码字符response.setContentType("application/octet-stream"); //设置内容类型为下载类型response.setHeader("Content-disposition", "attachment;filename=" + zipName);//设置下载的文件名称//将打包后的文件写到客户端,输出的方法同上,使用缓冲流输出  bis = new BufferedInputStream(new FileInputStream(zipFilePath));byte[] buff = new byte[bis.available()];bis.read(buff);out.flush();//释放缓存out.write(buff);//输出数据文件} catch (IOException e) {e.printStackTrace();throw new GeneralBizException("-------------文件下载失败----------------");} finally {doClose(bis, out, zos);}}

压缩文件方法

 /*** 压缩文件** @param zipBasePath 临时压缩文件基础路径* @param zipName     临时压缩文件名称* @param zipFilePath 临时压缩文件完整路径* @param filePaths   需要压缩的文件路径集合* @throws IOException*/private String zipFile(String zipBasePath, String zipName, String zipFilePath, List<String> filePaths, ZipOutputStream zos) throws IOException {//循环读取文件路径集合,获取每一个文件的路径for (String filePath : filePaths) {File inputFile = new File(filePath);  //根据文件路径创建文件if (inputFile.exists()) { //判断文件是否存在if (inputFile.isFile()) {  //判断是否属于文件,还是文件夹//创建输入流读取文件BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputFile));//将文件写入zip内,即将文件进行打包zos.putNextEntry(new ZipEntry(inputFile.getName()));//写入文件的方法,同上int size = 0;byte[] buffer = new byte[1024];  //设置读取数据缓存大小while ((size = bis.read(buffer)) > 0) {zos.write(buffer, 0, size);}//关闭输入输出流zos.closeEntry();bis.close();} else {  //如果是文件夹,则使用穷举的方法获取文件,写入ziptry {File[] files = inputFile.listFiles();List<String> filePathsTem = new ArrayList<String>();for (File fileTem : files) {filePathsTem.add(fileTem.toString());}return zipFile(zipBasePath, zipName, zipFilePath, filePathsTem, zos);} catch (Exception e) {e.printStackTrace();}}}}return null;}

关闭文件流

private void doClose(InputStream inputStream, OutputStream... outputStreams) {try {if (isNotNull(inputStream)) {inputStream.close();}if (isNotNull(outputStreams) && outputStreams.length > 0) {for (OutputStream outputStream : outputStreams) {outputStream.close();}}} catch (IOException e) {e.printStackTrace();}}

java.util.zip包 OutputStream ZipOutputStream以压缩包的方式导出或下载多个文件,比如图片,文档,Excel表格等相关推荐

  1. java.util.zip_[Java 基础] 使用java.util.zip包压缩和解压缩文件

    Java API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作. 我们可以使用该包中的方法,结合IO中的相关知识,进行文件的压缩和解压缩相关操作. Zi ...

  2. 使用java.util.zip包实现根据文件目录控制文件的压缩与解压

    根据文件目录实现文件的压缩与解压 import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputSt ...

  3. 完美java.util.zip使用,实现zip压缩和解压

    之前找了很多demo代码在压缩中遇到各种问题,中文乱码.文本内容丢失等. 以下教程是本人亲自测试过,通过java.util.zip包实现java代码的文件zip压缩和解压: 1.压缩: 1)压缩一个文 ...

  4. Java获取压缩包内文件数_使用java.util.zip.ZipFile,压缩包内文件数量过多则报错问题....

    引入的jar包不对,或者你的压缩文件不标准.62616964757a686964616fe78988e69d8331333365646331一般就会报这个错误.关于上面英语的翻译:Key featur ...

  5. Java解压缩zip包+rar包兼容rar4和rar5兼容多操作系统

    业务背景:需要将zip包或者rar包进行解压缩,需要兼容rar4和rar5两种版本 maven 依赖包: <dependency><groupId>com.github.jun ...

  6. JavaDemo——使用java.util.zip压缩和解压

    Demo: /*** 2019年6月20日下午4:59:37*/ package testzip;import java.io.File; import java.io.FileInputStream ...

  7. 使用java.util.zip对字符串进行压缩和解压缩

    /** * 压缩字符串为 byte[] * 储存可以使用new sun.misc.BASE64Encoder().encodeBuffer(byte[] b)方法 * 保存为字符串 * * @para ...

  8. java加密文件夹_使用java.util.zip压缩文件夹,支持加密,增加描述

    导读热词 下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. import java.io.File; import java.io.File ...

  9. java.util.concurrent包

    本文是我们学院课程中名为Java Concurrency Essentials的一部分 . 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如原子性,同步和线程安全之 ...

最新文章

  1. 最优的去重处理——HashSet去重
  2. 在Ubuntu 12.04 64bit上搭建Crtmpserver视频直播服务
  3. python退出命令-python退出指令
  4. LightOJ 1259 Goldbach`s Conjecture 素数打表
  5. 涨知识!参加过将近三十届广交会的老鸟总结!
  6. T- SQL性能优化详解
  7. 蓝桥 试题 基础练习 杨辉三角形——11行代码AC
  8. 修改weblogic端口的方法
  9. Django/Flask/Tornado三大web框架性能分析
  10. javaScript中的回调函数
  11. vue 1.0源代码重点难点分析
  12. mysql离线安装 window_5分钟完成mysql离线安装
  13. Python调用海康威视网络相机之——python读取相机rtsp码流显示画面
  14. 渗透中POC、EXP、Payload、Shellcode和exploit的区别
  15. Mac 外接显示器色彩不正常解决方案
  16. Macropodus 新词发现详解(new word discovery, python3)
  17. MySQL the configuration step Starting Server is taking the longer than expected
  18. 【Codeforces613D】Kingdom and its Cities【虚树】【Tree DP】倍增lca
  19. 你看这雪花如此的美丽
  20. scratch学习_和 Vicky 一起学习 Scratch 系列之十三 — 作曲

热门文章

  1. STM32串口接收数据处理方法
  2. 过敏性鼻炎的认识误区
  3. 四川长虹IHO-3000T_高安版(CA版)_晶晨S905L-B_当贝桌面线刷固件包
  4. 深度学习之:什么是流形(manifold)?流形空间,流形学习
  5. 海外营销人员福音:新的TikTok工具,用过的都说好
  6. android studio生成Jni头文件 java10,java11删除了javah,改用javac直接用源码生成jni头文件。 java8是用javah
  7. mysql fulltext match_使用Mysql全文搜索Full-Text (fulltext和 match...against)
  8. 如何给 ESP32 选择外接 Flash 以及如何使能 QIO 模式
  9. 向全世界说晚安,月亮,谢谢你陪我!
  10. 【黑马pink老师函数及应用作业】写一个函数,用户输入任意两个数字的最大值,并能弹出运算后的结果