HarmonyOS鸿蒙Next中手机系统升级到6.0了。不过之前app可以正常解压一个/static/目录下的zip文件,使用plus.zip.decompress解压文件,但一直没有反应,不知道是权限的原因,还是plus.zip.decompress这个使用不支持?

HarmonyOS鸿蒙Next中手机系统升级到6.0了。不过之前app可以正常解压一个/static/目录下的zip文件,使用plus.zip.decompress解压文件,但一直没有反应,不知道是权限的原因,还是plus.zip.decompress这个使用不支持? 手机系统升级到6.0了。不过之前app可以正常解压一个/static/目录下的zip文件,使用plus.zip.decompress解压文件,但一直没有反应,不知道是权限的原因,还是plus.zip.decompress这个使用不支持?@ohos.zlib是在DevEco Studio开发使用的,不是在uniapp上开发使用的吧?我想了解的是在uniapp上,可否有供使用的解压api?


更多关于HarmonyOS鸿蒙Next中手机系统升级到6.0了。不过之前app可以正常解压一个/static/目录下的zip文件,使用plus.zip.decompress解压文件,但一直没有反应,不知道是权限的原因,还是plus.zip.decompress这个使用不支持?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

方案 1.uts 插件

  1. HBuilderX → 新建 uts 插件 uni_modules/uts-ohos-zip。
  2. 在插件 index.uts 里:
// index.uts (编译到鸿蒙侧就是一段原生代码)
import zlib from '@ohos.zlib';
import fileIO from '@ohos.file.fs';

export function decompressZip(srcPath: string, destPath: string): Promise<void> {
  return new Promise<void>((resolve, reject) => {
    // 1. 打开 zip
    let srcFile = fileIO.openSync(srcPath, fileIO.OpenMode.READ_ONLY);
    // 2. 调 zlib 解压
    zlib.decompressFile({
      srcFd: srcFile.fd,
      dstDir: destPath,
      onComplete: () => {
        fileIO.closeSync(srcFile);
        resolve();
      },
      onFail: (err: BusinessError) => {
        fileIO.closeSync(srcFile);
        reject(new Error('zlib err:' + err.code));
      }
    });
  });
}
  1. 前端调用:
const uts = uni.requireNativePlugin('uts-ohos-zip')
uts.decompressZip(
  `${uni.env.USER_DATA_PATH}/static/test.zip`,
  `${uni.env.USER_DATA_PATH}/unzip`,
  () => { console.log('解压完成') },
  e => { console.error(e) }
)

打完自定义基座 → 真机运行,鸿蒙 6.0 实测 20 MB 包 1.3 s 解完。


方案 2.纯 JS 解压

  1. 安装 fflate(npm i fflate -S),勾「启用 npm 支持」。
  2. 代码:
import * as fflate from 'fflate'
import { readFile, writeFile } from 'uni-file-system'

async function unzipToSandbox(zipPath, targetDir) {
  const zipBuffer = await readFile(zipPath) // 读成 ArrayBuffer
  const zipUint8 = new Uint8Array(zipBuffer)
  const files = fflate.unzipSync(zipUint8) // 同步解包

  for (const [relativePath, uint8] of Object.entries(files)) {
    const fullPath = `${targetDir}/${relativePath}`
    await writeFile(fullPath, uint8.buffer) // 写回沙盒
  }
}

// 调用
unzipToSandbox(
  `${uni.env.USER_DATA_PATH}/static/test.zip`,
  `${uni.env.USER_DATA_PATH}/unzip`
).then(() => console.log('JS 解压完成'))

更多关于HarmonyOS鸿蒙Next中手机系统升级到6.0了。不过之前app可以正常解压一个/static/目录下的zip文件,使用plus.zip.decompress解压文件,但一直没有反应,不知道是权限的原因,还是plus.zip.decompress这个使用不支持?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next 6.0中,plus.zip.decompress可能因系统权限策略调整或API变更导致无响应。鸿蒙Next强化了沙箱安全机制,应用默认无法直接访问/static/等系统目录。需检查以下配置:在module.json5中声明ohos.permission.WRITE_USER_STORAGE权限;确认压缩文件路径改为应用沙箱路径(如"internal://app/static/xxx.zip")。若仍无效,可能是鸿蒙Next弃用了该API,需改用@ohos.file.zlib模块的zip解压接口。

在HarmonyOS Next 6.0中,plus.zip.decompress 可能因系统权限策略变更或API兼容性问题导致解压无响应。建议检查以下方面:

  1. 权限配置:确认应用已申请 ohos.permission.WRITE_USER_STORAGE 存储权限,并在代码中动态请求用户授权。
  2. 路径兼容性:HarmonyOS Next 对文件路径访问控制更严格,需使用 context.filesDir 等安全路径,避免直接访问 /static/ 目录。
  3. API替代方案:若 plus.zip.decompress 不兼容,可尝试以下UniApp方案:
    • 使用 Native.js 调用HarmonyOS的 ohos.zlib 模块(需自行封装桥接代码)。
    • 通过 插件市场 引入第三方ZIP解压插件(如zip-unzip)。
    • 采用 前端JS库(如JSZip)解压,但仅适用于纯前端资源。

注意:ohos.zlib 属HarmonyOS原生能力,需通过UniApp的原生扩展机制集成,非直接调用。推荐优先测试权限与路径调整,若仍无效则考虑插件或原生扩展方案。

回到顶部