java.util.zip包 OutputStream ZipOutputStream以压缩包的方式导出或下载多个文件,比如图片,文档,Excel表格等
目录
- 前言
- 逻辑流程
- 代码
- 请求接口
- 压缩文件方法
- 关闭文件流
前言
接到个需求,从数据库查询出多个用户,每个用户都会有头像,以压缩包的方式下载这些用户的头像,这里用到了java.util.zip
包下的zip工具类。
逻辑流程
获取前端请求接口和参数。
查询所有用户头像地址,并使用
List<String> filePaths
存储。调用文件压缩方法。
写出文件流。
关闭文件流。
代码
请求接口
/*** 批量导出附件,附件以压缩包的形式下载*/
@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表格等相关推荐
- java.util.zip_[Java 基础] 使用java.util.zip包压缩和解压缩文件
Java API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作. 我们可以使用该包中的方法,结合IO中的相关知识,进行文件的压缩和解压缩相关操作. Zi ...
- 使用java.util.zip包实现根据文件目录控制文件的压缩与解压
根据文件目录实现文件的压缩与解压 import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputSt ...
- 完美java.util.zip使用,实现zip压缩和解压
之前找了很多demo代码在压缩中遇到各种问题,中文乱码.文本内容丢失等. 以下教程是本人亲自测试过,通过java.util.zip包实现java代码的文件zip压缩和解压: 1.压缩: 1)压缩一个文 ...
- Java获取压缩包内文件数_使用java.util.zip.ZipFile,压缩包内文件数量过多则报错问题....
引入的jar包不对,或者你的压缩文件不标准.62616964757a686964616fe78988e69d8331333365646331一般就会报这个错误.关于上面英语的翻译:Key featur ...
- Java解压缩zip包+rar包兼容rar4和rar5兼容多操作系统
业务背景:需要将zip包或者rar包进行解压缩,需要兼容rar4和rar5两种版本 maven 依赖包: <dependency><groupId>com.github.jun ...
- JavaDemo——使用java.util.zip压缩和解压
Demo: /*** 2019年6月20日下午4:59:37*/ package testzip;import java.io.File; import java.io.FileInputStream ...
- 使用java.util.zip对字符串进行压缩和解压缩
/** * 压缩字符串为 byte[] * 储存可以使用new sun.misc.BASE64Encoder().encodeBuffer(byte[] b)方法 * 保存为字符串 * * @para ...
- java加密文件夹_使用java.util.zip压缩文件夹,支持加密,增加描述
导读热词 下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. import java.io.File; import java.io.File ...
- java.util.concurrent包
本文是我们学院课程中名为Java Concurrency Essentials的一部分 . 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如原子性,同步和线程安全之 ...
最新文章
- 最优的去重处理——HashSet去重
- 在Ubuntu 12.04 64bit上搭建Crtmpserver视频直播服务
- python退出命令-python退出指令
- LightOJ 1259 Goldbach`s Conjecture 素数打表
- 涨知识!参加过将近三十届广交会的老鸟总结!
- T- SQL性能优化详解
- 蓝桥 试题 基础练习 杨辉三角形——11行代码AC
- 修改weblogic端口的方法
- Django/Flask/Tornado三大web框架性能分析
- javaScript中的回调函数
- vue 1.0源代码重点难点分析
- mysql离线安装 window_5分钟完成mysql离线安装
- Python调用海康威视网络相机之——python读取相机rtsp码流显示画面
- 渗透中POC、EXP、Payload、Shellcode和exploit的区别
- Mac 外接显示器色彩不正常解决方案
- Macropodus 新词发现详解(new word discovery, python3)
- MySQL the configuration step Starting Server is taking the longer than expected
- 【Codeforces613D】Kingdom and its Cities【虚树】【Tree DP】倍增lca
- 你看这雪花如此的美丽
- scratch学习_和 Vicky 一起学习 Scratch 系列之十三 — 作曲
热门文章
- STM32串口接收数据处理方法
- 过敏性鼻炎的认识误区
- 四川长虹IHO-3000T_高安版(CA版)_晶晨S905L-B_当贝桌面线刷固件包
- 深度学习之:什么是流形(manifold)?流形空间,流形学习
- 海外营销人员福音:新的TikTok工具,用过的都说好
- android studio生成Jni头文件 java10,java11删除了javah,改用javac直接用源码生成jni头文件。 java8是用javah
- mysql fulltext match_使用Mysql全文搜索Full-Text (fulltext和 match...against)
- 如何给 ESP32 选择外接 Flash 以及如何使能 QIO 模式
- 向全世界说晚安,月亮,谢谢你陪我!
- 【黑马pink老师函数及应用作业】写一个函数,用户输入任意两个数字的最大值,并能弹出运算后的结果