首页 > 解决方案 > JSZip 复制文件并在创建新 zip 时出错

问题描述

我现有的代码允许用户上传压缩文件并将该文件传递给另一个函数以进行更多处理。在这些步骤之间,我想添加逻辑来检查压缩文件的内容,进行任何必要的修改,并传递新的压缩文件。我写了以下内容:

JSZip.loadAsync(file).then(function(zip) {
    zip.forEach(function(relativePath, zipEntry) {
        //Change extension name
        fName = zipEntry.name.substr(0, zipEntry.name.lastIndexOf(".")) + ".docx";
        zip.file(fName, zipEntry, { compression: "DEFLATE" });
        console.log(zip.file(fName, zipEntry, { compression: "DEFLATE" }));
        zip.generateAsync({type: "blob"}).then(function(content) {
            saveAs(content, "test.zip");
        });
    });
});

诚然,我是 JavaScript 新手,但我相信我已经缩小了问题的范围。

第一个问题是文件重复,因为 console.log 输出告诉我在 JSZip 对象中找到了 4 个文件,但原始上传仅包含 2 个文件,“example_file.doc”和“example_file2.doc”:

example_file.doc: ZipObject {name: "example_file.docx", dir: false, date: Wed Feb 20 2019 08:42:58 GMT-0500 (Eastern Daylight Time), comment: null, unixPermissions: null, …}
example_file.docx: ZipObject {name: "example_file.docx", dir: false, date: Tue Feb 26 2019 11:39:23 GMT-0500 (Eastern Standard Time), comment: null, unixPermissions: null, …}
example_file2.doc: ZipObject {name: "example_file2.docx", dir: false, date: Wed Feb 20 2019 09:07:04 GMT-0500 (Eastern Daylight Time), comment: null, unixPermissions: null, …}
example_file2.docx: ZipObject {name: "example_file2.docx", dir: false, date: Tue Feb 26 2019 11:39:23 GMT-0500 (Eastern Standard Time), comment: null, unixPermissions: null, …}

下一个问题是可能与上述问题直接相关的错误:

未捕获(承诺)错误:无法读取“example_file.docx”的数据。是否是受支持的 JavaScript 类型(String、Blob、ArrayBuffer 等)

此错误总共输出到控制台 4 次,并引用了 4 个文件。我确定这是由于我的 zip.generateAsync 代码存在问题,但从未使用过 Blob 或 Promises,我不确定问题的根本原因是什么。

最后,我不确定如何将新生成的 zip 文件(如果我可以正确生成)保存在内存中并将其发送到下一个函数。现在有代码可以将其保存在本地,但这不是最终目标,更像是一个占位符。

对于这些问题的任何帮助将不胜感激,即使它只是一个提示或朝着正确方向迈出的一步。

标签: javascriptzipjszip

解决方案


推荐阅读