跳到主要内容 JSZip 使用指南:JavaScript 创建、读取与编辑 ZIP 文件 | 极客日志
JavaScript Node.js 大前端
JSZip 使用指南:JavaScript 创建、读取与编辑 ZIP 文件 JSZip 库的使用指南,这是一个纯 JavaScript 实现的 ZIP 文件处理库,适用于浏览器和 Node.js 环境。内容涵盖安装引入、创建与生成 ZIP 文件、读取本地及远程压缩包、高级功能如流式处理大文件、常见问题的解决方案(如中文乱码、兼容性),以及在前端打包下载、用户上传解析和服务器端处理等实际场景中的应用。文章提供了详细的代码示例和性能优化建议,帮助开发者高效处理 ZIP 文件相关需求。
独立开发者 发布于 2026/3/25 更新于 2026/4/16 3 浏览JSZip 使用指南:JavaScript 创建、读取与编辑 ZIP 文件
你是否还在为 Web 应用中的文件打包和解析问题烦恼?无论是用户上传的批量文件处理,还是动态生成的报表打包下载,手动处理 ZIP 文件总是充满挑战。本文将带你掌握 JSZip——这个强大的 JavaScript 库,让你在浏览器和 Node.js 环境中轻松实现 ZIP 文件的创建、读取和编辑功能。读完本文,你将能够:创建自定义结构的 ZIP 文件、解析用户上传的压缩包内容、实现前端文件的批量下载,以及处理各种复杂的 ZIP 文件场景。
什么是 JSZip? JSZip 是一个纯 JavaScript 实现的 ZIP 文件处理库,它提供了简洁优雅的 API,让开发者能够在浏览器和 Node.js 环境中轻松创建、读取和编辑 ZIP 文件。无论是 Web 应用中的文件打包下载,还是服务器端的 ZIP 文件处理,JSZip 都能胜任。
JSZip 的核心优势
纯 JavaScript 实现 :无需依赖任何二进制插件,可在浏览器和 Node.js 环境中无缝运行
简洁 API :直观的链式调用方式,降低开发难度
丰富功能 :支持 ZIP 文件的创建、读取、修改、压缩和解压缩
良好兼容性 :支持主流浏览器和 Node.js 版本
流式处理 :支持大文件的流式处理,避免内存溢出
快速开始
安装与引入 在浏览器环境中,你可以直接通过 CDN 引入 JSZip:
<script src="https://cdn.bootcdn.net/ajax/libs/jszip/3.10.1/jszip.min.js" ></script>
const JSZip = require ('jszip' );
第一个示例:创建并下载 ZIP 文件 下面是一个简单的示例,演示如何创建一个包含文本文件的 ZIP 文件并下载:
const zip = new JSZip ();
zip.file ("Hello.txt" , "Hello World\n" );
const imgFolder = zip.folder ("images" );
imgFolder.file ("smile.gif" , imgData, {base64 : true });
zip.generateAsync ({type : "blob" }).then (function (content ) {
saveAs (content, "example.zip" );
});
创建 ZIP 文件
基本文件操作 JSZip 提供了直观的 API 来操作 ZIP 文件内容:
const zip = new JSZip ();
zip.file ("hello.txt" , "Hello World\n" );
const folder = zip.folder ("subfolder" );
folder.file ("hello.txt" , "Hello from subfolder\n" );
zip.file ("anotherfolder/goodbye.txt" , "Goodbye World\n" );
zip.file ("hello.txt" , "Updated content" );
zip.remove ("anotherfolder/goodbye.txt" );
生成 ZIP 文件 创建好 ZIP 文件结构后,使用 generateAsync 方法生成 ZIP 文件内容:
zip.generateAsync ({type : "blob" })
.then (function (blob ) {
saveAs (blob, "myzip.zip" );
});
zip.generateAsync ({type : "base64" })
.then (function (base64 ) {
});
zip.generateAsync ({type : "uint8array" })
.then (function (uint8array ) {
});
type:输出类型,可以是"blob"、"base64"、"uint8array"、"arraybuffer"、"binarystring"或"nodebuffer"(Node.js 环境)
compression:压缩方式,"STORE"(不压缩)或"DEFLATE"(默认压缩)
compressionOptions:压缩选项,如压缩级别
读取 ZIP 文件
读取本地 ZIP 文件 在浏览器中,你可以通过 File API 读取用户上传的 ZIP 文件:
document .getElementById ('file' ).addEventListener ('change' , function (event ) {
const file = event.target .files [0 ];
if (!file) return ;
const reader = new FileReader ();
reader.onload = function (e ) {
const content = e.target .result ;
JSZip .loadAsync (content).then (function (zip ) {
zip.forEach (function (relativePath, zipEntry ) {
console .log ("文件:" , relativePath);
});
});
};
reader.readAsArrayBuffer (file);
});
读取远程 ZIP 文件
JSZipUtils .getBinaryContent ('path/to/remote.zip' , function (err, data ) {
if (err) {
throw err;
}
JSZip .loadAsync (data).then (function (zip ) {
const file = zip.file ("file.txt" );
if (file) {
file.async ("string" ).then (function (content ) {
console .log ("文件内容:" , content);
});
}
});
});
高级功能
文件内容读取 zip.file ("hello.txt" ).async ("string" ).then (function (content ) {
console .log ("文件内容:" , content);
});
zip.file ("image.png" ).async ("base64" ).then (function (base64Data ) {
});
zip.file ("data.bin" ).async ("uint8array" ).then (function (uint8Array ) {
});
流式处理大文件 对于大文件,JSZip 支持流式处理以避免内存问题:
zip.generateNodeStream ({type : 'nodebuffer' , streamFiles : true })
.pipe (fs.createWriteStream ('large.zip' ))
.on ('finish' , function ( ) {
console .log ("大型 ZIP 文件生成完成" );
});
处理复杂 ZIP 文件 JSZip 能够处理各种复杂的 ZIP 文件场景,包括加密文件、分卷压缩、ZIP64 格式等。例如,处理包含多种格式文件的复杂 ZIP:
JSZip .loadAsync (complexZipData).then (function (zip ) {
zip.file ("AntarcticaTemps.xlsx" ).async ("arraybuffer" ).then (function (data ) {
});
zip.file ("AntarcticaTemps.ods" ).async ("arraybuffer" ).then (function (data ) {
});
zip.file ("Franz Kafka - The Metamorphosis.epub" ).async ("arraybuffer" ).then (function (data ) {
});
});
实际应用场景
1. 前端文件打包下载 在 Web 应用中,经常需要将多个文件打包成 ZIP 供用户下载。例如,在线编辑器中多个文件的导出功能:
const zip = new JSZip ();
zip.file ("index.html" , editor.getValue ());
zip.folder ("css" ).file ("style.css" , styleEditor.getValue ());
zip.folder ("js" ).file ("app.js" , scriptEditor.getValue ());
zip.generateAsync ({type : "blob" }).then (function (content ) {
saveAs (content, "project.zip" );
});
2. 解析用户上传的 ZIP 文件 处理用户上传的 ZIP 文件,提取其中的内容进行预览或处理:
function handleZipUpload (file ) {
const reader = new FileReader ();
reader.onload = function (e ) {
JSZip .loadAsync (e.target .result ).then (function (zip ) {
displayZipContents (zip);
const htmlFile = zip.file (/\.html$/i )[0 ];
if (htmlFile) {
htmlFile.async ("string" ).then (function (content ) {
previewHtmlContent (content);
});
}
});
};
reader.readAsArrayBuffer (file);
}
3. 服务器端 ZIP 文件处理 在 Node.js 服务器中,JSZip 可以用于生成动态报告、备份文件等:
const express = require ('express' );
const JSZip = require ('jszip' );
const fs = require ('fs' );
const app = express ();
app.get ('/download-report' , function (req, res ) {
const zip = new JSZip ();
zip.file ("report.txt" , generateReport ());
zip.file ("chart.png" , fs.readFileSync ("charts/sales.png" ), {binary : true });
zip.generateAsync ({type : 'nodebuffer' }).then (function (buffer ) {
res.setHeader ('Content-Type' , 'application/zip' );
res.setHeader ('Content-Disposition' , 'attachment; filename="report.zip"' );
res.send (buffer);
});
});
常见问题与解决方案
中文乱码问题 ZIP 文件中的文件名和内容可能出现中文乱码,解决方案是指定正确的编码:
JSZip .loadAsync (zipData, {charset : "GBK" }).then (function (zip ) {
});
大文件处理
const stream = zip.generateNodeStream ({type : 'nodebuffer' , streamFiles : true });
stream.pipe (fs.createWriteStream ('large.zip' ))
.on ('finish' , function ( ) {
console .log ("大文件生成完成" );
});
浏览器兼容性 虽然 JSZip 支持大部分现代浏览器,但在一些旧浏览器中可能需要 polyfill:
<script src ="https://cdn.bootcdn.net/ajax/libs/es6-promise/4.2.8/es6-promise.min.js" > </script >
<script src ="https://cdn.bootcdn.net/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js" > </script >
性能优化
压缩策略
zip.file ("document.txt" , largeTextContent, { compression : "DEFLATE" , compressionOptions : {level : 9 } });
zip.file ("image.png" , imageData, { compression : "STORE" });
内存管理
zip.file ("temp.dat" ).async ("uint8array" ).then (function (data ) {
processData (data);
zip.remove ("temp.dat" );
});
总结 JSZip 是一个功能强大且易于使用的 ZIP 文件处理库,它让 JavaScript 开发者能够轻松实现 ZIP 文件的创建、读取和编辑功能。无论是 Web 应用中的文件打包下载,还是服务器端的 ZIP 文件处理,JSZip 都能提供简洁高效的解决方案。
通过本文的介绍,你已经掌握了 JSZip 的基本用法和高级特性。现在,你可以开始在自己的项目中应用 JSZip,解决各种 ZIP 文件处理需求。
微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
JavaScript 压缩与混淆 Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online