首页 > 解决方案 > JSZip 库,检查 zipfile 是否加密

问题描述

美好的一天,我想知道如何使用 JSZip 库检查 zip 文件是否已加密。我目前尝试执行 loadAsync 函数,然后如果它转到 .catch() 我总是认为它的原因是因为它是加密的。我知道应该有更好的方法来做到这一点,所以我尝试检查库本身,然后找到调用 isEncrypted() 函数的条目。我只是不知道如何访问这些条目。有谁知道怎么做?

if (hasZipFileFlag === true) {
var jszip = new JSZip();
try {
    await jszip.loadAsync(testZip).then(function(res) {
      UtilLogClass.logFunc('ZIP READ SUCCESSFULLY', res);
    }).catch((err) => {
      UtilLogClass.logFunc('jszip loadAsync then() ERROR', err);
      zipFileHasPassFlag = true;
    });
  } catch (err) {
    UtilLogClass.logFunc('ZIP READ ERROR', err);
  }
}

※testZip 已经是一个具有“application/x-zip-compressed”类型的 DOM 对象,我已经有办法确定它是否是一个 zip 文件。

标签: javascriptjszip

解决方案


JSZip 限制文档看来,这是不可能的:

并非 zip 文件的所有功能都受支持。经典 zip 文件可以工作,但不支持加密 zip、多卷等,并且 loadAsync() 方法将返回失败的承诺。

编辑(根据评论):

您可以将代码重构为如下所示:

if (hasZipFileFlag === true) {
  var jszip = new JSZip();
  try {
    const res = await jszip.loadAsync(testZip);
    UtilLogClass.logFunc("ZIP READ SUCCESSFULLY", res);
  } catch (err) {
    // if(err === "encrypted error from JSZip") { ... } 
    zipFileHasPassFlag = true;
    UtilLogClass.logFunc("ZIP READ ERROR", err);
  }
}

该方法抛出的任何错误loadAync(...)都将被catch块捕获。


推荐阅读