重点功能代码:

@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 实现多文件批量下载并压缩相关推荐

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

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

  2. 通俗易懂【Springboot】 单文件下载和批量下载(多个文件合成一个压缩包下载)

    文章目录 一.单文件下载 1.简单理解文件下载 2.单文件下载的具体代码实现 3.测试 4.单文件下载整体代码 二.多文件批量下载(多个文件合成一个压缩包下载) 1.多文件下载的实现方式,这里使用了Z ...

  3. 亿彩文件批量下载器 v3.0

    简介: 亿彩文件批量下载器,主要用于对已知的网络文件的Url,将其批量下载到本地上,并根据需要自动更名下载后的文件,功能丰富强大;支撑大容量几十万几百万条的下载,支持特殊网址的导入,支持保留网络路径结 ...

  4. java oss如何下载文件_Java OSS批量下载并压缩为ZIP代码实例

    这篇文章主要介绍了Java OSS批量下载并压缩为ZIP代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 /** * 批量下载为zip * @ ...

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

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

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

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

  7. JavaScript (mp3、mp4、jpg、doc、txt、rar)单个、多文件批量下载

    JavaScript 多文件下载 HTML5中 a 标签新增了一个属性 download,一般情况下,用户点击a链接浏览器会打开对应的链接地址,如果链接地址是一个文件如(xxx.rar.xxx.jpg ...

  8. react——利用jszip实现文件批量下载并打包成zip文件

    本文章主要记录利用jszip实现文件批量下载图片,文档.mp3,视频(MP4)等文件,一般而言前端实现下载功能一般都是通过a链,这在下载单个文件的场景很实用,但如果是批量下载很多个文件,同样也可以用a ...

  9. 文件批量下载方法 文件批量下载工具

    软件版本:Internet Download Manager 在当今数字化时代,我们日常使用电脑进行各种工作和娱乐活动.有时候,我们需要从互联网上下载大量文件,例如电影.音乐.文档等.在这种情况下,手 ...

最新文章

  1. linux之账号管理
  2. iOS 开发中的MVVM介绍(译)
  3. udp和tcp是服务器响应,HTTP,TCP,UDP的理解和使用
  4. MySQL数据库优化实战
  5. java 8中 predicate chain的使用
  6. JAVA获取JVM内存空间和物理内存空间
  7. 数据同步到redis中时候需要 需要给关联的表增加id 如果是一对多 则增加list存储id 如果是一个 则增加一个字段 ;目的是便于取值...
  8. python怎么复数乘方开方_孩子数学不好怎么办?怎样让孩子学好数学的方法
  9. python基于给定时间戳生成 未来/过去 前进/倒退 n个小时的时间戳
  10. myeclipse 配置 SVN
  11. A guess 解题报告
  12. 吴恩达深度学习笔记(Dropout正则化)
  13. vb学生管理系统服务器编程,利用VB进行服务器编程实例汇总.doc
  14. pcb地线应该不应该做成环路_电源PCB设计流程及要点全解析
  15. NSA网络武器被公开,面对突发性的高危漏洞事件,我们应该如何应对?
  16. stylegan2报错“undefined symbol: _ZN10tensorflow12OpDefBuilder6OutputESs”的解决方案
  17. 【华为OJ】【067-求最小公倍数】
  18. 我的Android开发半年工作经验总结
  19. AndroidSDK的目录详解
  20. 计算机网络智能化在铁路通信的发展,关于接入网技术在铁路通信中的应用

热门文章

  1. 【HTTP】连接管理--TCP
  2. (5)基于hadoop的简单网盘应用实现1
  3. 基于单片机的交通信号灯系统设计(#0405)
  4. MATLAB解线性方程组和一元多次方程
  5. 四月扬州 镇江自游行攻略
  6. 思科路由器ospf多区域配置
  7. iptables 7层过滤
  8. ECharts 柱状排名图 柱子上方显示文字与图标
  9. linux禁止root用户su,Linux禁止普通用户su至root的解决方法
  10. (swing读书笔记)Undo/Redo(上)