uni-app跨端稳定解压仅两种方案:uts插件调用原生能力,或用fflate纯js库内存解压;fflate体积小、全平台兼容,但仅支持无密码utf-8编码zip,超20mb应选uts插件。

uni-app 本身不提供原生 ZIP 解压能力,plus.zip.decompress 在 iOS 和部分 Android 设备上会直接报错 {"code":5,"message":"不允许写"},这不是权限配置问题,而是底层限制。真正能跨端稳定解压的方案只有两种:用 UTS 插件调用原生能力,或用纯 JS 库(如 fflate)在内存中解压。
用 fflate 替代 JSZip,轻量且兼容性好
fflate 是目前 uni-app 中最实用的纯 JS 解压方案:体积小(约 15KB)、支持流式解压、无 Node.js 依赖、对 H5/小程序/APP 全平台友好。而 JSZip 在 nvue 页面或真机调试时容易因 ArrayBuffer 处理逻辑出错,尤其在 iOS 上常卡在 loadAsync 不返回。
- 安装:
npm install fflate,然后在页面中import { unzip } from 'fflate' - 只适用于 ZIP 格式(非 .7z/.rar),且压缩包不能含密码、不能有中文路径(除非服务端用 UTF-8 存档)
- 解压结果是内存对象,需手动遍历
unzip返回的Map,再用uni.getFileSystemManager().writeFile()写入本地 - 不要尝试直接解压超 20MB 的 ZIP——内存溢出风险高,应优先选 UTS 插件
uni-zip 插件在 manifest.json 中配置失败怎么办
很多开发者按文档在 manifest.json 的 plugins 字段加了 uni-zip,但运行时报 requireNativePlugin is not a function 或插件未注册。这是因为该插件仅支持 App 端(不支持 H5 和小程序),且必须通过 HBuilderX「插件市场」安装并勾选「启用」,手动写 JSON 不生效。
- 正确路径:HBuilderX → 项目右键 →「插件安装」→ 搜索
uni-zip→ 安装后重启项目 - 调用前务必加判断:
const zip = uni.canIUse('requireNativePlugin:uni-zip') && uni.requireNativePlugin('uni-zip') -
zipFilePath必须是本地绝对路径(如_doc/xxx.zip),不能是临时路径tempFilePath,否则安卓报错“文件不存在” - iOS 下
unzipToPath只能写入uni.env.USER_DATA_PATH或uni.env.TEMP_PATH,写其他路径会静默失败
UTS 插件(如 XF-zipUTS)解压带密码 ZIP
如果 ZIP 有密码,纯 JS 方案基本不可行(fflate 和 JSZip 都不支持),只能靠 UTS 封装的原生能力。XF-zipUTS 提供了 unzipWithPassword 方法,但要注意它只在 nvue 页面有效(vue 页面无法调用)。
- 调用前确认页面是
.nvue后缀,并已正确引入:import { unzipWithPassword } from "@/uni_modules/XF-zipUTS" - 密码参数必须是字符串,空字符串
""表示无密码,不能传null或undefined - 解压目标路径
destDirectory需提前创建,可用uni.getFileSystemManager().mkdir()预处理 - 安卓上若解压后文件乱码,大概率是 ZIP 打包时用了 GBK 编码,需让后端改用 UTF-8 重新打包
真正难的不是“怎么解压”,而是路径、编码、权限、插件作用域这四点交叉导致的静默失败。建议先用一个不含子目录、无密码、小于 2MB 的 ZIP,在 nvue 页面里跑通 XF-zipUTS;再逐步放开限制验证边界情况。











