记录一次过滤文件下载并打包文件
需求说明,业务需要,需要将SFTP上的文件下载到服务器,并打包成加密zip 上传到其他服务器上,返回记录的下载地址以及解压密码
主要有几个地方值得记录:
1、由于文件名可能存在重复的情况,下载到服务器本地,需要对重复的文件名加上后缀 _x 处理,例如:
ThisIsAFile.pdf
ThisIsAFile.pdf 处理后,该文件名被修改为 ThisIsAFile_1.pdf
本来打算使用replace 去实现,但是考虑到极端情况下,文件名称可能有类似后缀的这种情况,那么文件名称也会被修改,所以采用正则表达式去处理。
// 临时文件名
String tempFileName = baseDir + URL_SPLIT + userId + URL_SPLIT + s + URL_SPLIT + eInvoice.getInvoiceName();
File tempFile;
// 判断是否有重名文件 有则下划线_x 作为文件名进行区分
File[] files = file.listFiles((dir, name) -> {
// 去掉 _x 比较是否重复
String curFileName = name.toLowerCase().replaceAll("_\\d*\\.pdf$", ".pdf")
.replaceAll("_\\d*\\.ofd$",".ofd");
if (curFileName.equals(eInvoice.getInvoiceName().toLowerCase())) {
return true;
}
return false;
});
// 如果有重复的,则按照重复数修改文件名称
if (files.length >= 1) {
tempFileName = tempFileName.replace(".pdf", "_" + files.length + ".pdf");
}
tempFile = new File(tempFileName);
tempFile.createNewFile();
outputStream = new FileOutputStream(tempFile);
String pdfPath = eInvoice.getPath();
// 执行下载
try {
factory.download(pdfPath, outputStream);
} catch (Exception e) {
outputStream.close();
tempFile.delete();
}
上述为for循环的部分代码,主要是判断文件是否重复,重复则重命名文件,执行下载,后续则要对其进行加密压缩处理
_\\d*\\.pdf$
这条正则表达式的意思是最后文件已.pdf结尾 并且有 _xxx.pdf 的形式的字符串 xxx 为任意数字
2、文件加密打包成zip 实现
主要借助zip4j 实现对文件的加密压缩,引入的依赖如下:
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>1.3.2</version>
</dependency>
传入需要压缩的文件目录以及输出压缩目录即可
/**
* 加密压缩文件
*
* @param srcFile 源文件
* @param dstFile 目标文件
* @param encode 加密密码
*/
public static void encryptZipFile(String srcFile, String dstFile, String encode) {
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
parameters.setPassword(encode.toCharArray());
try {
ZipFile zipFile = new ZipFile(dstFile);
zipFile.setFileNameCharset("GBK");
zipFile.addFolder(srcFile, parameters);
} catch (Exception e) {
log.error("文件打包出错", e);
}
}
标签:文件,String,parameters,重复,tempFile,打包,文件名称,pdf,下载
From: https://www.cnblogs.com/charler/p/17145653.html