一只开发狗001 2024-10-31 16:37 采纳率: 25%
浏览 118
已结题

JSzip压缩文件时如何设置解压缩密码

js中使用JSZip 3.0 压缩文件,但是想要在压缩时设置解压缩密码,也就是用户在解压zip压缩包时需要输入密码才能解压。但是却无论如何也设置不了。
请问用JSZip怎么设置,或者还有其他方法能设置吗?
后端是java的,后端若是能设置也行,但是最好是直接设置,而不是使用zip4j将文件解压后重新压缩设置,因为这样很不理想。

 zip.generateAsync({
            type: "blob", // 指定生成的文件类型为Blob
            compression: "DEFLATE", // 使用DEFLATE压缩算法(也可以设置为STORE表示不压缩
            encryption: "AES",
            password: "123",
            compressionOptions: {
                level: 9 // 设置压缩等级为9(最优压缩)
            }
        })

上述加入password是没有作用的。

  • 写回答

20条回答 默认 最新

  • caozhenyu650 2024-10-31 17:22
    关注

    此答案是由GPT4和本人亲自作答,如有帮助,还请采纳!
    在使用 JSZip 3.0 压缩文件时,确实可以通过设置参数来进行压缩,但是需要注意的是,JSZip 本身并不支持直接在生成 ZIP 文件时设置密码保护。为了解决这个问题,您可以考虑以下几个方案:

    方案一:使用 JSZip 的扩展库

    JSZip 目前不支持直接设置密码保护,但可以结合其他库来实现。例如,您可以使用 zip.js 这个库,它支持加密功能。

    1. 使用 zip.js 设置密码

    首先,您需要引入 zip.js 库:

    <script src="https://cdn.rawgit.com/gildas-lormeau/zip.js/master/zip.js"></script>
    

    然后,您可以使用如下代码压缩并加密文件:

    function generateEncryptedZip(files, password) {
        // 创建一个 zip 文件
        var zipWriter = new zip.ZipWriter(new zip.BlobWriter("application/zip"), {
            password: password,
            encryption: "AES" // 使用 AES 加密
        });
    
        // 添加文件到 zip
        files.forEach(function(file) {
            zipWriter.add(file.name, new zip.BlobReader(file.blob));
        });
    
        // 完成生成并返回 zip Blob
        zipWriter.close().then(function(blob) {
            // 处理 blob,例如下载
            saveAs(blob, "encrypted.zip");
        });
    }
    
    // 示例使用
    generateEncryptedZip([
        { name: "file1.txt", blob: new Blob(["Hello World!"]) },
        { name: "file2.txt", blob: new Blob(["Another file"]) }
    ], "12345");
    

    2. 下载文件

    使用 FileSaver.js 库来下载生成的 ZIP 文件:

    <script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js"></script>
    

    方案二:后端加密

    如果您希望在后端进行处理,Java 中的 java.util.zip 包本身并不支持加密 ZIP 文件。您可以使用第三方库如 zip4j 来实现。

    1. 使用 zip4j

    首先,您需要添加 zip4j 依赖(例如在 Maven 中):

    <dependency>
        <groupId>net.lingala.zip4j</groupId>
        <artifactId>zip4j</artifactId>
        <version>2.11.0</version>
    </dependency>
    

    然后,可以使用以下代码创建加密 ZIP 文件:

    import net.lingala.zip4j.ZipFile;
    import net.lingala.zip4j.model.ZipParameters;
    import net.lingala.zip4j.model.enums.EncryptionMethod;
    import net.lingala.zip4j.model.enums.CompressionMethod;
    
    import java.io.File;
    
    public class ZipExample {
        public static void main(String[] args) {
            try {
                String zipFilePath = "encrypted.zip";
                String password = "12345";
    
                ZipFile zipFile = new ZipFile(zipFilePath);
    
                ZipParameters zipParameters = new ZipParameters();
                zipParameters.setCompressionMethod(CompressionMethod.DEFLATE);
                zipParameters.setEncryptionMethod(EncryptionMethod.AES);
                zipParameters.setPassword(password);
    
                // 添加文件到 zip
                zipFile.addFiles(Arrays.asList(new File("file1.txt"), new File("file2.txt")), zipParameters);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    方案三:前后端结合

    您可以在前端使用 JSZip 来生成 ZIP 文件,然后在后端使用 zip4j 对文件进行加密处理。这样,您可以在不重新压缩的情况下,利用后端的能力为生成的 ZIP 文件设置密码。

    具体流程:

    1. 前端压缩:使用 JSZip 将文件压缩成 ZIP。
    2. 上传文件:将生成的 ZIP 文件上传到后端。
    3. 后端加密:使用 zip4j 对上传的 ZIP 文件进行加密处理,并返回加密后的 ZIP 文件给前端。

    总结

    在 JSZip 中直接设置解压缩密码并不被支持,您可以考虑使用 zip.js 来满足需求,或者在后端使用 zip4j 来处理加密。根据您的需求和项目结构,选择合适的方法。如果需要确保使用的是加密格式,结合前后端的方法可能会是最佳选择。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(19条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月1日
  • 已采纳回答 11月1日
  • 创建了问题 10月31日