HarmonyOS鸿蒙Next中使用jszip库解压带密码的zip报错

HarmonyOS鸿蒙Next中使用jszip库解压带密码的zip报错

【问题现象】

导入jszip库,使用以下代码解压加密zip文件,解压过程中报错:

export class ZipFileUtil {
  static unzipFile(context: common.UIAbilityContext) {
    let zipFilePath = context.cacheDir + "/******.zip"
    const jszip = new JSZip();
    jszip.loadAsync(zipFilePath,{
      password: '********'
    }).then((data: JSZip) => {
      LogUtil.error(`解压缩解密文件成功 ${JSON.stringify(data)}`)
    }).catch((err: Error) => {
      LogUtil.error(`解压缩加密文件失败! 错误原因: ${err.message}`)
    })
  }
}

报错内容如下:

1 ERROR: ArkTS:ERROR Failed to resolve OhmUrl.
Error Message: Failed to get a resolved OhmUrl for "hvigor_ignore_C:_work_DevEco_xxproject_********_oh_modules_.ohpm_[@ohos](/user/ohos)+jszip@1.0.0_oh_modules_@ohos_jszip_src_main_type_index.d.ts" imported by "C:\work\DevEco\xxproject\*******\entry\src\main\ets\util\ZipFileUtil.ets".
* Try the following:
Check whether the module which hvigor_ignore_C:_work_DevEco_xxproject_*****_oh_modules_.ohpm_[@ohos](/user/ohos)+jszip@1.0.0_oh_modules_@ohos_jszip_src_main_type_index.d.ts belongs to is correctly configured.
Check the corresponding file name is [jszip](https://github.com/Stuk/jszip)correct(including case-sensitivity).

【背景知识】

jszip是node.js平台上广泛使用的zip库。

主要功能:

  1. 创建压缩文件:使用jszip,你可以在客户端动态生成zip文件并包含多个文件和文件夹。
  2. 读取压缩文件:你可以在浏览器中读取和解析zip文件中的内容,包括文件和文件夹的结构和数据。
  3. 修改压缩文件:jszip允许你向现有的ZIP文件中添加、更新或删除文件和文件夹。
  4. 压缩和解压缩数据:jszip不仅可以处理文件,还可以用于压缩和解压缩数据,比如JSON、文本等。
  5. 支持异步操作:jszip支持异步操作,这在处理大型压缩文件时特别有用,可以避免阻塞用户界面。

HarmonyOS新加入了解压带密码的zip文件的能力,该三方库HarmonyOS版本,托管在OpenHarmony三方库中心仓上。

【定位思路】

执行解压后失败,报错Encrypted zip: unsupported encrypt method:

点击放大

怀疑压缩文件加密算法不匹配,溯源加密文件,是在MAC电脑上用console里的zip -e直接压缩得到的zip文件,加密算法是PKZIP 2.0。

经研究:

  1. PKZIP 2.0并不安全,容易被破解,参考What encryption method is used by the zip program in macOS? - Information Security Stack Exchange
  2. jszip暂无计划支持PKZIP 2.0,理由也是安全原因。jszip使用了AES加密(属于高级加密标准,1|2|3,默认3(AES-256))。

【解决方案】

@ohos/jszip移植自js库jszip,原库本身就不支持PKZIP 2.0加密。

研究发现minizip当前仍然支持PKZIP 2.0 算法加解密。

请注意minizip需要在真机中运行。

import { unzipToDirectory } from '[@ohos](/user/ohos)/minizip';
unzipToDirectory(selectFilePath, targetPath, '********').then(() => {
    LogUtil.error('解压成功')
}).catch(() => {
    LogUtil.error('解压失败') 
});

【总结】

在MAC电脑上用console里的zip -e直接压缩得到的zip文件加密算法为PKZIP 2.0。

需要使用minizip对PKZIP 2.0加密的压缩包解密,jszip仅支持AES算法加解密。


更多关于HarmonyOS鸿蒙Next中使用jszip库解压带密码的zip报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中使用jszip库解压带密码的zip报错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中使用jszip库解压带密码的zip文件时,如果遇到报错,可能是由于以下几个原因:

  1. jszip库版本问题:确保使用的jszip库版本支持带密码的zip文件解压。较旧版本可能不支持此功能。

  2. 密码格式或输入错误:检查密码是否正确,确保密码格式与压缩时一致,包括大小写和特殊字符。

  3. 文件损坏或格式问题:确认zip文件未损坏,且符合标准zip格式。

  4. 鸿蒙Next环境兼容性:jszip库可能未完全适配鸿蒙Next环境,导致某些功能无法正常使用。

  5. 权限问题:确保应用具有读取和写入文件的权限,否则可能导致解压失败。

  6. 异步处理问题:如果使用异步方法解压,确保回调函数或Promise处理正确,避免因异步操作未完成而报错。

  7. 依赖缺失:检查是否缺少jszip库所需的依赖项,如Buffer或Stream相关模块。

建议检查以上问题,并根据具体报错信息进行排查。

回到顶部