如何实现文件批量重命名后再进行批量打包下载
在项目中会遇到一些批量下载打包的简单功能,今天我们给大家分享一个:批量打包下载,且对打包的文件进行批量重名
1.表结构
| 字段名 | 备注 |
| tutorial_id | 教材ID |
| turtorial_origin_name | 源文件名 |
| turtorial_upload_name | 存储文件名 |
| turtorial_upload_path | 存储路径 |
| turtorial_sort | 教材排序 |
2.功能描述
(1)库表存储的文件以“turtorial_upload_name”为标准,文件名称随机生成的uuid
(2)当批量下载文件,其打包文件名字根据“turtorial_upload_name”命名
问题:如果我们需要在进行打包下载之前修改文件名称为“源文件名”,程序应该如何实现
3.初期代码实现
(1)依赖包:hutool
(2)工具类:cn.hutool.core.util.ZipUtil
(3)实现基本思路:
- 获取多个教材的路径,封装到File中
- 设置文件压缩的路径,此路径为临时下载路径
- 创建ZipUtil对象,封装多个教材的File对象
- IO流传输
- 删除临时
初期代码参考
public void donwloadTutorial(String fileName, String paramJson, HttpServletResponse response) throws IOException {
// 返回json字符串为集合,通过TypeReference进行类型转换
List<Map<String,String>> param = JsonFactory.json2bean(paramJson, new JsonFactory.TypeReference<List<Map<String,String>>>());
List<File> fileList = new ArrayList<>();
// 获取教材的路径
for (Map<String, String> map : param) {
String tutorialUploadPath = map.get("tutorialUploadPath");
String filePath = downloadPath + tutorialUploadPath;
fileList.add(FileUtil.file(filePath));
}
// 文件压缩,并保存到临时路径
File zipFile = new File(downloadPath + "achive.zip");
ZipUtil.zip(zipFile, false, fileList.toArray(new File[fileList.size()]));
InputStream is = new FileInputStream(zipFile);
ResponseExportUtil.exportFileWithStream(response, is, fileName);
is.close();
// 删除临时文件
FileUtil.del(zipFile);
}
4.优化代码,完成文件重名再打包下载
基本思路:
- 创建临时目录,存放重命名后的文件
- 获取教材的路径
- 复制并覆盖同名文件
- 文件压缩,并保存到临时路径
- 发送压缩文件
- 删除临时文件
优化后代码参考
public void donwloadTutorial(String fileName, String paramJson, HttpServletResponse response) throws IOException {
// 返回json字符串为集合,通过TypeReference进行类型转换
List<Map<String,String>> param = JsonFactory.json2bean(paramJson, new JsonFactory.TypeReference<List<Map<String,String>>>());
// 创建临时目录存放重命名后的文件
File tempDir = FileUtil.mkdir(downloadPath + "/temp/" + "tutorial_download_" + System.currentTimeMillis());
List<File> renamedFiles = new ArrayList<>();
File zipFile = new File(downloadPath + "achive.zip"); // 压缩文件临时存储名称
try {
// 获取教材的路径
for (Map<String, String> map : param) {
String tutorialUploadPath = map.get("tutorialUploadPath"); // 教材上传路径
String tutroialOriginName = map.get("tutorialOriginName"); // 教材原始名称
// 验证原始文件名非空且合法
if (StrUtil.isBlank(tutroialOriginName)) {
throw new IllegalArgumentException("原始文件名不能为空");
}
tutroialOriginName = FileUtil.cleanInvalid(tutroialOriginName); // 清理非法字符
String filePath = downloadPath + tutorialUploadPath; // 源文件的路径, 例如, /data/upload/course_content/tutorial/pdf/2023-05-05/1.pdf
File sourceFile = FileUtil.file(filePath); // 源文件,存储在数据库上的真实路径
if (!sourceFile.exists()) {
throw new FileNotFoundException("文件不存在: " + sourceFile.getPath());
}
// 在临时目录创建重命名后的文件
File renamedFile = FileUtil.file(tempDir, tutroialOriginName); // 在临时目录创建重命名后的文件
FileUtil.copy(sourceFile, renamedFile, true); // 复制并覆盖同名文件
renamedFiles.add(renamedFile);
}
// 文件压缩,并保存到临时路径
ZipUtil.zip(zipFile, false, renamedFiles.toArray(new File[renamedFiles.size()]));
// 发送压缩文件
try (InputStream is = new FileInputStream(zipFile)) {
ResponseExportUtil.exportFileWithStream(response, is, fileName);
}
} finally {
// 删除临时文件
FileUtil.del(tempDir);
FileUtil.del(zipFile);
}
}

浙公网安备 33010602011771号