java中下载多个文件和文件夹打压缩包下载,并自定义包中每个文件的名称

我的需求是一个可以批量下载文件或文件夹的接口,下载一个文件就正常下载,下载多个文件或单个多个文件夹都压缩成zip下载

本来想的是直接用hutool里面的ziputil工具类就行,但是我这里报错的文件都是用随机字符串命名的,直接用ZipUtil.zip方法下载下来的压缩包中文件都是原本文件的随机字符串名称

下面是我的处理方式,其中的一些工具类和压缩相关的类还是用的hutool中的,只不过没有用ZipUtil封装好的方法

@Override@OperLog(type = OperType.DOWNLOAD)public void download(List<String> ids) {List<WebDisk> webDiskList = this.webDiskMapper.selectList(new QueryWrapper<WebDisk>().in("id", ids));if (webDiskList.isEmpty()) {throw new RuntimeException("文件不存在,下载失败");}if (webDiskList.size() == 1 && webDiskList.get(0).isFile()) {WebDisk webDisk = webDiskList.get(0);try (FileInputStream is = new FileInputStream(this.getFullPath(webDisk));ServletOutputStream os = response.getOutputStream()) {response.setContentType(request.getSession().getServletContext().getMimeType(webDisk.getFileSuffix())); // 获取文件的mimetyperesponse.setHeader("content-disposition", "attachment;fileName=" + URLEncoder.encode(webDisk.getOriginName(), "UTF-8"));IoUtil.copy(is, os);} catch (IOException e) {e.printStackTrace();throw new RuntimeException("下载失败,系统内部错误");}} else {response.setContentType(request.getSession().getServletContext().getMimeType("zip")); // 获取文件的mimetypetry (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {response.setHeader("content-disposition", "attachment;fileName=" +URLEncoder.encode(FileNameUtil.mainName(webDiskList.get(0).getOriginName()) + ".zip", "UTF-8"));webDiskList.forEach(webDisk -> {try {this.addFileToZip(webDisk, zos, "", new HashMap<>());} catch (IOException e) {e.printStackTrace();throw new RuntimeException(e);}});} catch (IOException e) {throw new RuntimeException(e);}}}

主要的方法就是下面这个 addFileToZip方法

因为上传文件的时候用随机字符串命名就是为了防止文件名称重复,所以这里打压缩包的时候给他们都设置为上传时候的原名称,但是为了防止名称重复,以名称后面累加括号加数字的方式重命名了

因为我上传的时候校验了不能上传重复名称的文件夹,所以我这里就只处理了重名的文件

 private void addFileToZip(WebDisk webDisk, ZipOutputStream zos, String path, Map<String, Integer> nameCount) throws IOException {String filePath = this.getFullPath(webDisk);File file = FileUtil.file(filePath);String curFilePath = path + (webDisk.isFile() ? webDisk.getOriginName() : (webDisk.getOriginName() + "/"));ZipEntry zipEntry = new ZipEntry(curFilePath);try {zos.putNextEntry(zipEntry);} catch (ZipException e) {// 有重复名称文件String mainName = FileNameUtil.mainName(curFilePath);String extName = FileNameUtil.extName(curFilePath);int num = MapUtil.getInt(nameCount, curFilePath, 0) + 1;String newFilePath = path + mainName + "(" + num + ")" + "." + extName;zipEntry = new ZipEntry(newFilePath);zos.putNextEntry(zipEntry);nameCount.put(curFilePath, num);}if (file.isFile()) {try (FileInputStream is = new FileInputStream(file)) {IoUtil.copy(is, zos);} catch (IOException e) {e.printStackTrace();}} else if (file.isDirectory()) {this.webDiskMapper.selectList(new QueryWrapper<WebDisk>().eq("pid", webDisk.getId()).eq("is_delete", 0)).forEach(sub -> {try {this.addFileToZip(sub, zos, webDisk.getOriginName() + File.separator, nameCount);} catch (IOException e) {e.printStackTrace();}});}zos.closeEntry();}

需要注意的是我这里目录的层级关系已经维护到表里了,所以递归找下级的时候直接查的库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/754812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬盘哨兵Hard Disk Sentinel Pro V6.20.0.0 便携版

Hard Disk Sentinel 是一款功能强大的硬盘监控和分析软件&#xff0c;专为 Windows 用户设计。它可以实时监测硬盘驱动器&#xff08;HDD&#xff09;、固态硬盘&#xff08;SSD&#xff09;、混合硬盘&#xff08;SSHD&#xff09;、NVMe SSD、RAID 数组和外部 RAID 盒子的健康…

uniapp可视范围高度 - 用户屏幕可操作的屏幕高度 - 适用于APP、H5@公众号、纯H5@Chrome

可视范围高度 let heightPx uni.getWindowInfo().windowHeight uni.getWindowInfo().windowTop 官方手册 uni.getWindowInfo() | uni-app官网uni-app,uniCloud,serverless,uni.getWindowInfo()https://uniapp.dcloud.net.cn/api/system/getWindowInfo.html 实测数据 uni.ge…

【精准】北斗同步时钟(北斗卫星授时服务器)助力医疗信息化

【精准】北斗同步时钟&#xff08;北斗卫星授时服务器&#xff09;助力医疗信息化 【精准】北斗同步时钟&#xff08;北斗卫星授时服务器&#xff09;助力医疗信息化 北斗时钟同步服务器是一款支持NTP和SNTP网络时间同步协议&#xff0c;高精度、大容量、高品质的高科技时钟产品…

十、MySQL主从架构配置

一、资源配置 主库&#xff1a;192.168.134.132 从库&#xff1a;192.168.134.133 从库&#xff1a;192.168.134.134 二、主从同步基本原理&#xff1a; master用户写入数据&#xff0c;会生成event记录到binary log中&#xff0c;slave会从master读取binlog来进行数据同步…

Java安全 反序列化(1) URLDNS链原理分析

Java安全 反序列化(1) URLDNS链原理分析 文章目录 Java安全 反序列化(1) URLDNS链原理分析前置知识应用分析payload1.新建HashMap类2.新建URL类3.获取URL 的 Class对象4.通过反射访问URL内部变量5.通过反射为URL中类赋值6.调用HashMap#put方法传入key和value7.再次通过反射为UR…

铝壳电阻的工艺结构原理及选型参数总结

🏡《总目录》 目录 1,概述2,工作原理3,结构特点4,工艺流程4.1,原材料准备4.2,点胶4.3,高温烘烤4.4,组合4.5,焊接4.6,表面处理4.7,电气性能测试5,选型参数5.1,阻值(Resis

ocp考试是中文还是英文?ocp认证好考吗

ocp认证是中文还是英文考试ocp认证的考试常用语种是英文&#xff0c;除开英文之外还有日语等语种&#xff0c;但是目前没有中文(12c的时候有过中文考试)&#xff0c;所以考生最好具有一定的英语水平再报名参加考试&#xff0c;ocp认证考试的形式为机试&#xff0c;考试的题型全…

面向未来的前沿人工智能监管

策制定者应该为未来十年人工智能系统更加强大的世界做好准备。这些发展可能会在人工智能科学没有根本性突破的情况下发生&#xff0c;只需扩展当今的技术以在更多数据和计算上训练更大的模型即可。 用于训练前沿人工智能模型的计算量在未来十年可能会显着增加。到 2020 年代末…

kafka什么情况下会认为发送失败进而去重试

在Kafka中&#xff0c;发送消息的过程是异步的&#xff0c;即消息后不会立即得到发送结果。Kafka会将消息添加到发送缓冲区&#xff0c;并立即返回一个成功的响应。因此&#xff0c;Kafka并不会直接知道消息是否成功发送到了目标主题的分区。 Kafka在以下情况下会认为发送失败…

03.生命周期和工程化开发入门

一、Vue生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09;什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a;就是一个Vue实例从创建 到 销毁 的整个过程。 生命…

【Linux】日常使用命令(三)

文章目录 **cal 命令****date 命令****bc 命令****Linux下玩小游戏**&#xff1a; cal 命令 功能描述: cal 命令用于显示日历。 常用选项: -3&#xff1a;显示前一个月、当前月和下一个月的日历。-y&#xff1a;显示整年的日历。 常用示例: # 示例 1: 显示当前月的日历 cal# …

MyBatis3源码深度解析(十四)SqlSession的创建与执行(一)Configuration与SqlSession的创建过程

文章目录 第五章 SqlSssion的创建过程前言5.1 XPath方法解析XML文件5.1.1 XPath的基本用法5.1.2 MyBatis使用XPathParser工具类 5.2 Configuration实例创建过程5.3 SqlSession实例创建过程 第五章 SqlSssion的创建过程 前言 MyBatis的核心组件之一SqlSession对象&#xff0c;…

python知识点总结(四)

这里写目录标题 1、Django 中的缓存是怎么用的&#xff1f;2、现有2元、3元、5元共三种面额的货币&#xff0c;如果需要找零99元&#xff0c;一共有多少种找零的方式?3、代码执行结果4、下面的代码执行结果为&#xff1a;5、说一下Python中变量的作用域。6、闭包7、python2与p…

css属性选择器总结

属性选择器 属性选择器在 CSS2 中就已经被引入&#xff0c;并且在 CSS3 及更高版本中仍然被广泛使用&#xff0c;因为它们提供了一种灵活且强大的方式来选择具有特定属性的元素。 [attr]&#xff1a; 是一个属性选择器&#xff0c;用于选择具有指定属性的所有元素&#xff0c;…

发票OCR-国税可进行的发票查验种类-接口文档

发票查验内容包括发票种类名称、发票代码、发票号码、金额、销售方名称、购买方名称等信息。可以在国家税务总局全国增值税发票查验平台上进行查验&#xff0c;也可以进入发票所属省、直辖市税务局官方网站的“我要查询-发票查询”模块进行查验&#xff0c;企业也可以通过发…

二叉树遍历(牛客网)

描述 编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以指针方式存储&#xff09;。 例如如下的先序遍历字符串&#xff1a; ABC##DE#G##F### 其中“#”表示的是空格&#xff0c;空格字符代表空树。建立起此二叉树…

LeetCode_29_中等_两数相除

文章目录 1. 题目2. 思路及代码实现详解&#xff08;Python&#xff09;2.1 位运算与二分查找 1. 题目 给你两个整数&#xff0c;被除数 d i v i d e n d dividend dividend 和除数 d i v i s o r divisor divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算…

20240318uniapp怎么引用组件

在script中增加 import index from "/pages/index/index.vue" 把index直接整个作为一个组件引入 然后注册组件 在export default中增加 components: {index:index }, 注册了index组件&#xff0c;内容为import的index 然后就可以在template里使用 <index&…

机器人可反向驱动能力与力控架构

反向驱动性是电机传动系统的机械特性&#xff0c;它描述了运动是否可以轻松反转 。特别是&#xff0c;反向驱动能力取决于两个因素&#xff1a;传动运动效率和整体执行器机械阻抗。反向运动中传动装置的低运动效率意味着所施加的外力的大部分被运动反作用力抵消。然而&#xff…

Ubuntu 搭建gitlab服务器,及使用repo管理

一、GitLab安装与配置 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务。 1、安装Ubuntu系统&#xff08;这个教程很多&#xff0c;就不展开了&#xff09;。 2、安装gitlab社区版本&#xff0c;有需…