jszip 解压 zip 文件需传 arraybuffer 而非 file 对象,图片需转 blob 并用 url.createobjecturl 显示,大文件应改用 zip.js 流式解压,且必须校验并清理 zip 内路径防止安全风险。

HTML 本身不支持 ZIP 压缩或解压,所有操作必须依赖 JavaScript 库 + 浏览器 API(如 File、Blob、URL.createObjectURL),且仅限用户主动选择的文件——不能直接读取本地磁盘路径或自动解压远程 ZIP。
JSZip 解压 ZIP 文件时,loadAsync() 报错或卡住?
常见现象是控制台出现 Uncaught (in promise) Error: Invalid or corrupted zip 或 Promise 永远不 resolve。根本原因不是 ZIP 文件损坏,而是传入了错误的数据类型。
-
JSZip.loadAsync()只接受Blob、ArrayBuffer或Uint8Array,不能直接传File对象(虽然File是Blob子类,但某些浏览器对构造方式敏感) - 正确做法:用
file.arrayBuffer()获取 ArrayBuffer,再传给JSZip.loadAsync() - 别用过时的
JSZipUtils.getBinaryContent()——它已废弃,且在 CORS 场景下必然失败 - 如果 ZIP 来自
fetch(),确保响应头含Content-Type: application/zip,否则response.blob()可能被误判为 text/plain
解压后图片显示为黑块或 404?
这不是解压失败,而是资源引用方式不对。JSZip 解压出的是原始二进制数据,不能直接当 URL 用。
- 对图片文件,必须调用
file.async('arraybuffer')→ 转成Blob→ 用URL.createObjectURL()生成临时 URL - 错误写法:
<img src="data:image/png;base64," base64str>——JSZip 不提供现成 base64,且大图 base64 会拖慢渲染 - 正确顺序:
const blob = await zip.file('img/logo.png').async('blob'); const url = URL.createObjectURL(blob); img.src = url; - 记得在页面卸载前调用
URL.revokeObjectURL(url),否则内存泄漏
大 ZIP 文件(>50MB)解压卡死或崩溃?
JSZip 在主线程全量加载并解压,遇到大文件极易触发浏览器内存限制或 UI 冻结。这不是代码 bug,是架构限制。
- 换用
zip.js(@zip.js/zip.js),它默认启用 Web Worker 和流式读取 - 初始化时显式指定
workerUrl,避免跨域加载失败:new zip.ZipReader(new zip.BlobReader(file), { workerUrl: 'https://cdn.jsdelivr.net/npm/@zip.js/zip.js@2.7.28/worker.js' }) - 用
readEntries()先获取目录结构,再按需解压单个文件,而不是一次性unzipAll() - 若需密码解压,
zip.js支持,但 JSZip 不支持(需额外引入 crypto 模块且不推荐前端做密码解密)
真正容易被忽略的是路径安全性:ZIP 文件内可能含 ../../../etc/passwd 这类恶意路径,JSZip 默认不做校验。解压前必须用正则或 path.normalize()(配合 path-browserify)清理路径,否则用户选一个 ZIP 就可能覆盖你页面上的任意 DOM 元素。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











