SpringBoot + zip4j 实现多文件批量下载并压缩
重点功能代码:
@Async("threadPoolNeo4jTaskExecutor")public void batchDownload(Long engSid, UserDownload entity) {// 查询指定案卷信息File rootDir = null;File archDir = null;String tempDirStr = null;ArchInfo archInfo = archInfoService.selectByPrimaryKey(entity.getArchSid());if (archInfo != null) {// 电子文件打包中entity.setSid(engSid);entity.setDownloadState("2");userDownloadService.updateByPrimaryKeySelective(entity);String rootDirStr = this.rootPath();tempDirStr = String.valueOf(System.currentTimeMillis());// 临时存放目录rootDir = new File(rootDirStr, tempDirStr);if (!rootDir.exists()) {rootDir.mkdir();}archDir = new File(rootDir, archInfo.getArchTitle());if (!archDir.exists()) {archDir.mkdirs();}// 查询指定案卷涉及电子文件Map<String, Object> param = new HashMap<String, Object>();param.put("archSid", archInfo.getSid());List<FileInfo> fileInfos = fileInfoService.findByParams(param);if (CollectionUtils.isNotEmpty(fileInfos)) {for (FileInfo item : fileInfos) {// 获取文件根路径String fileDir = transPath(item.getPdfPath() != null ? item.getPdfPath() : "");if (fileDir != null || fileDir.length() > 0) {File file = new File(fileDir + item.getPdfFilename());// 判断文件是否存在if (file.exists() && archDir.exists()) {// 文件拷贝try {FileUtils.copyFile(file, new File(archDir, item.getFileTitle() + ".pdf"));} catch (Exception e) {log.error("export efile task, copy pdf file error : ", e);}}}}try {Zip4jUtil.zip(archDir.getAbsolutePath(),rootDir.getAbsolutePath() + File.separator + archInfo.getArchTitle() + ".zip", "");} finally {// 电子文件打包下载完成entity.setSid(engSid);entity.setDownloadState("3");entity.setDownloadAddress(rootDir.getAbsolutePath() + File.separator + archInfo.getArchTitle() + ".zip");userDownloadService.updateByPrimaryKeySelective(entity);}}}}
Zip4jUtil 工具类源码:
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;import org.apache.commons.lang3.StringUtils;import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.FileHeader;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;/** * ZIP压缩文件操作工具类 * 支持密码 * 依赖zip4j开源项目(http://www.lingala.net/zip4j/) * 版本1.3.1 */
public class Zip4jUtil { /** * 使用给定密码解压指定的ZIP压缩文件到指定目录 * <p> * 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出 * @param zip 指定的ZIP压缩文件 * @param dest 解压目录 * @param passwd ZIP文件的密码 * @return 解压后文件数组 * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 */ public static File [] unzip(String zip, String dest, String passwd) throws ZipException { File zipFile = new File(zip); return unzip(zipFile, dest, passwd); } /** * 使用给定密码解压指定的ZIP压缩文件到当前目录 * @param zip 指定的ZIP压缩文件 * @param passwd ZIP文件的密码 * @return 解压后文件数组 * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 */ public static File [] unzip(String zip, String passwd) throws ZipException { File zipFile = new File(zip); File parentDir = zipFile.getParentFile(); return unzip(zipFile, parentDir.getAbsolutePath(), passwd); } /** * 使用给定密码解压指定的ZIP压缩文件到指定目录 * <p> * 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出 * @param zip 指定的ZIP压缩文件 * @param dest 解压目录 * @param passwd ZIP文件的密码 * @return 解压后文件数组 * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 */ @SuppressWarnings("unchecked")public static File [] unzip(File zipFile, String dest, String passwd) throws ZipException { ZipFile zFile = new ZipFile(zipFile);
// zFile.setFileNameCharset(ApplicationPropertiesHolder.getProperty("zip4j.charset", "GBK"));zFile.setFileNameCharset("GBK");if (!zFile.isValidZipFile()) { throw new ZipException("压缩文件不合法,可能被损坏."); } File destDir = new File(dest); if (destDir.isDirectory() && !destDir.exists()) { destDir.mkdir(); } if (zFile.isEncrypted()) {zFile.setPassword(passwd.toCharArray()); } zFile.extractAll(dest); List<FileHeader> headerList = zFile.getFileHeaders(); List<File> extractedFileList = new ArrayList<File>(); for(FileHeader fileHeader : headerList) { if (!fileHeader.isDirectory()) { extractedFileList.add(new File(destDir,fileHeader.getFileName())); } } File [] extractedFiles = new File[extractedFileList.size()]; extractedFileList.toArray(extractedFiles); return extractedFiles; } /** * 压缩指定文件到当前文件夹 * @param src 要压缩的指定文件 * @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败. */ public static String zip(String src) { return zip(src,null); } /** * 使用给定密码压缩指定文件或文件夹到当前目录 * @param src 要压缩的文件 * @param passwd 压缩使用的密码 * @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败. */ public static String zip(String src, String passwd) { return zip(src, null, passwd); } /** * 使用给定密码压缩指定文件或文件夹到当前目录 * @param src 要压缩的文件 * @param dest 压缩文件存放路径 * @param passwd 压缩使用的密码 * @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败. */ public static String zip(String src, String dest, String passwd) { return zip(src, dest, true, passwd); } /** * 使用给定密码压缩指定文件或文件夹到指定位置. * <p> * dest可传最终压缩文件存放的绝对路径,也可以传存放目录,也可以传null或者"".<br /> * 如果传null或者""则将压缩文件存放在当前目录,即跟源文件同目录,压缩文件名取源文件名,以.zip为后缀;<br /> * 如果以路径分隔符(File.separator)结尾,则视为目录,压缩文件名取源文件名,以.zip为后缀,否则视为文件名. * @param src 要压缩的文件或文件夹路径 * @param dest 压缩文件存放路径 * @param isCreateDir 是否在压缩文件里创建目录,仅在压缩文件为目录时有效.<br /> * 如果为false,将直接压缩目录下文件到压缩文件. * @param passwd 压缩使用的密码 * @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败. */ public static String zip(String src, String dest, boolean isCreateDir, String passwd) { File srcFile = new File(src); dest = buildDestinationZipFilePath(srcFile, dest); ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); // 压缩方式 parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); // 压缩级别 if (!StringUtils.isBlank(passwd)) {parameters.setEncryptFiles(true); parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD); // 加密方式 parameters.setPassword(passwd.toCharArray()); } try { ZipFile zipFile = new ZipFile(dest); if (srcFile.isDirectory()) { // 如果不创建目录的话,将直接把给定目录下的文件压缩到压缩文件,即没有目录结构 if (!isCreateDir) { File [] subFiles = srcFile.listFiles(); ArrayList<File> temp = new ArrayList<File>(); Collections.addAll(temp, subFiles); zipFile.addFiles(temp, parameters); return dest; } zipFile.addFolder(srcFile, parameters); } else { zipFile.addFile(srcFile, parameters); } return dest; } catch (ZipException e) { e.printStackTrace(); } return null; } /** * 构建压缩文件存放路径,如果不存在将会创建 * 传入的可能是文件名或者目录,也可能不传,此方法用以转换最终压缩文件的存放路径 * @param srcFile 源文件 * @param destParam 压缩目标路径 * @return 正确的压缩文件存放路径 */ private static String buildDestinationZipFilePath(File srcFile,String destParam) { if (StringUtils.isBlank(destParam)) { if (srcFile.isDirectory()) { destParam = srcFile.getParent() + File.separator + srcFile.getName() + ".zip"; } else { String fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf(".")); destParam = srcFile.getParent() + File.separator + fileName + ".zip"; } } else { createDestDirectoryIfNecessary(destParam); // 在指定路径不存在的情况下将其创建出来 if (destParam.endsWith(File.separator)) { String fileName = ""; if (srcFile.isDirectory()) { fileName = srcFile.getName(); } else { fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf(".")); } destParam += fileName + ".zip"; } } return destParam; } /** * 在必要的情况下创建压缩文件存放目录,比如指定的存放路径并没有被创建 * @param destParam 指定的存放路径,有可能该路径并没有被创建 */ private static void createDestDirectoryIfNecessary(String destParam) { File destDir = null; if (destParam.endsWith(File.separator)) { destDir = new File(destParam); } else { destDir = new File(destParam.substring(0, destParam.lastIndexOf(File.separator))); } if (!destDir.exists()) { destDir.mkdirs(); } }/** 文件操作 返回不带扩展名的文件名*/public static String getFileNameNoEx(String filename) {if ((filename != null) && (filename.length() > 0)) {int dot = filename.lastIndexOf('.');if ((dot > -1) && (dot < (filename.length()))) {return filename.substring(0, dot);}}return filename;}}
pom.xml 依赖:
<!-- zip处理工具包 --><dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>1.3.2</version></dependency>
SpringBoot + zip4j 实现多文件批量下载并压缩相关推荐
- 【java】 文件批量下载并压缩为zip压缩包
[java] 文件批量下载并压缩为zip压缩包 java常用的压缩技术 java中常见实现压缩与解压 业务场景 代码实现 注意点 java常用的压缩技术 常见的压缩格式有很多种,例如:zip.rar. ...
- 通俗易懂【Springboot】 单文件下载和批量下载(多个文件合成一个压缩包下载)
文章目录 一.单文件下载 1.简单理解文件下载 2.单文件下载的具体代码实现 3.测试 4.单文件下载整体代码 二.多文件批量下载(多个文件合成一个压缩包下载) 1.多文件下载的实现方式,这里使用了Z ...
- 亿彩文件批量下载器 v3.0
简介: 亿彩文件批量下载器,主要用于对已知的网络文件的Url,将其批量下载到本地上,并根据需要自动更名下载后的文件,功能丰富强大;支撑大容量几十万几百万条的下载,支持特殊网址的导入,支持保留网络路径结 ...
- java oss如何下载文件_Java OSS批量下载并压缩为ZIP代码实例
这篇文章主要介绍了Java OSS批量下载并压缩为ZIP代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 /** * 批量下载为zip * @ ...
- java文件批量下载打包成zip
1.首先html页面获取当前需要下载文件的id集合将转成字符串形式传递到后台. ................ 2 .下面就是获取字符串之后的批量下载/*** 多文件批量下载压缩成zip**root ...
- 多文件批量下载打包成.zip
多文件批量下载打包成.zip //下载文件打包成zip压缩包@GetMapping("/zip/{id}")public void zip(@PathVariable(" ...
- JavaScript (mp3、mp4、jpg、doc、txt、rar)单个、多文件批量下载
JavaScript 多文件下载 HTML5中 a 标签新增了一个属性 download,一般情况下,用户点击a链接浏览器会打开对应的链接地址,如果链接地址是一个文件如(xxx.rar.xxx.jpg ...
- react——利用jszip实现文件批量下载并打包成zip文件
本文章主要记录利用jszip实现文件批量下载图片,文档.mp3,视频(MP4)等文件,一般而言前端实现下载功能一般都是通过a链,这在下载单个文件的场景很实用,但如果是批量下载很多个文件,同样也可以用a ...
- 文件批量下载方法 文件批量下载工具
软件版本:Internet Download Manager 在当今数字化时代,我们日常使用电脑进行各种工作和娱乐活动.有时候,我们需要从互联网上下载大量文件,例如电影.音乐.文档等.在这种情况下,手 ...
最新文章
- linux之账号管理
- iOS 开发中的MVVM介绍(译)
- udp和tcp是服务器响应,HTTP,TCP,UDP的理解和使用
- MySQL数据库优化实战
- java 8中 predicate chain的使用
- JAVA获取JVM内存空间和物理内存空间
- 数据同步到redis中时候需要 需要给关联的表增加id 如果是一对多 则增加list存储id 如果是一个 则增加一个字段 ;目的是便于取值...
- python怎么复数乘方开方_孩子数学不好怎么办?怎样让孩子学好数学的方法
- python基于给定时间戳生成 未来/过去 前进/倒退 n个小时的时间戳
- myeclipse 配置 SVN
- A guess 解题报告
- 吴恩达深度学习笔记(Dropout正则化)
- vb学生管理系统服务器编程,利用VB进行服务器编程实例汇总.doc
- pcb地线应该不应该做成环路_电源PCB设计流程及要点全解析
- NSA网络武器被公开,面对突发性的高危漏洞事件,我们应该如何应对?
- stylegan2报错“undefined symbol: _ZN10tensorflow12OpDefBuilder6OutputESs”的解决方案
- 【华为OJ】【067-求最小公倍数】
- 我的Android开发半年工作经验总结
- AndroidSDK的目录详解
- 计算机网络智能化在铁路通信的发展,关于接入网技术在铁路通信中的应用