首页 > 其他分享 >文件名称重复检测,下载并打包文件

文件名称重复检测,下载并打包文件

时间:2023-02-22 19:57:18浏览次数:40  
标签:文件 String parameters 重复 tempFile 打包 文件名称 pdf 下载

记录一次过滤文件下载并打包文件

需求说明,业务需要,需要将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

相关文章