文件打包压缩
多文件打包为 ZIP 压缩包,支持拖拽上传,浏览器本地处理
拖拽文件到此处,或点击选择文件
支持所有文件类型,可上传多个文件
什么是 ZIP 压缩?
ZIP 打包会把选中的多个文件合并成一个可下载的压缩包,通常能减小体积,并让传输和归档更方便。它适合发送零散文件、准备交付包、整理截图、给邮件附加多份文档,或做小型备份。ZIP 是无损归档格式,解压后文件应当能完整还原;但 JPG、PNG、MP4、PDF 等本身已经压缩过的格式,体积未必会明显变小。这个浏览器工具在本地生成压缩包,选中的文件不需要上传到服务器。它更适合中等规模的文件集合,特别大的文件可能占用较多内存。ZIP 打包不是加密,敏感文件仍需要密码保护或其它安全流程。
使用方法
使用方法
- 将文件拖拽到上传区域,或点击「选择文件」按钮添加文件
- 查看文件列表,按需移除不需要的文件
- 输入 ZIP 文件名(可选)
- 点击「创建 ZIP 压缩包」按钮下载压缩文件
压缩说明
- 创建压缩包前请检查文件名和文件夹结构;ZIP 会保留路径,可能暴露非预期的名称。
- 用于长期存储或跨系统共享时,请避免文件名中出现不支持的字符。
使用场景
技术原理
ZIP 容器由 PKWARE 的 APPNOTE 规范定义(当前修订版 6.3.10)。`.zip` 文件由三种记录类型组成:每个存储文件前有一个本地文件头(Local File Header),签名为 4 字节的 `0x04034b50`(PK\x03\x04),后跟压缩数据;最后一个文件之后是中央目录(Central Directory),即文件头表(签名 `0x02014b50`),列出了每个条目的名称、大小、CRC-32 和指向本地头的偏移量;最后是中央目录结束记录(EOCD,签名 `0x06054b50`)位于文件最末尾,指向中央目录的起始位置。读取器从末尾解析 `.zip`:从文件尾部反向扫描 EOCD 签名,跳转到中央目录,然后定位到每个本地头——这就是 ZIP 支持流式追加和快速随机访问单个条目而无需读取整个归档的原因。 此工具使用 JSZip 库(fflate 作为更快的替代方案)在浏览器中组装归档。用户选择的每个 `File` 对象通过 `arrayBuffer()` 读取为 `ArrayBuffer`,用 `zip.file(name, buffer)` 添加到归档中,然后 `zip.generateAsync({ type: 'blob', compression: 'DEFLATE', compressionOptions: { level: 6 } })` 生成一个 `Blob`,通过 `URL.createObjectURL()` 暴露给用户下载。DEFLATE 是 ZIP 的标准压缩方法,定义在 RFC 1951 中;它结合了 LZ77 滑动窗口字典匹配和 Huffman 编码。压缩级别 6(默认值)是平衡点——级别 1 大约快 4 倍但体积大 5-15%,而级别 9 比级别 6 慢 2-3 倍,通常仅额外缩小 1-2%。 完整性通过 CRC-32 保证,使用 IEEE 802.3 多项式 `0xEDB88320`(反向形式)对每个文件计算,并存储在本地文件头和中央目录条目中。当通用标志位第 11 位被设置时,文件名以 UTF-8 写入(自 APPNOTE 6.3.0(2006 年)起为强制要求);未设置此标志时,旧工具会使用本地 OEM 代码页(DOS 上为 CP437,中文 Windows 上为 CP936/GBK),非 ASCII 文件名会出现乱码。经典 ZIP 格式使用 32 位字段存储大小和偏移量,单个条目和整个归档的上限约为 4 GiB(2³² − 1 = 4,294,967,295 字节);ZIP64(定义在 APPNOTE 4.5+ 中)通过额外字段将这些扩展为 64 位,但 JSZip 的内存构建方式将实际归档大小限制在几百 MB 以内,否则标签页会耗尽内存。
- ZIP 文件结构(PKWARE APPNOTE 6.3.10):本地文件头(`0x04034b50`)+ 文件数据,然后是中央目录(`0x02014b50`),以 EOCD(`0x06054b50`)结尾。
- 读取器从末尾解析:反向扫描 EOCD 签名,然后跳转到中央目录——这使得无需流式读取整个归档即可快速提取单个文件。
- DEFLATE 压缩(RFC 1951)= LZ77 滑动窗口字典 + Huffman 编码;级别 6 为默认平衡点,级别 9 约增加 1-2% 压缩率但慢 2-3 倍。
- 完整性:使用多项式 `0xEDB88320`(反向 IEEE 802.3)的 CRC-32,存储在本地头和中央目录中;提取时进行验证。
- UTF-8 文件名需要通用标志位第 11 位(APPNOTE 6.3.0,2006 年);未设置时,旧工具回退到 CP437 / 本地 OEM 代码页,非 ASCII 文件名会乱码。
- 经典 ZIP 对每个文件和整个归档的大小上限为 2³² − 1 = 4,294,967,295 字节;ZIP64 额外字段(APPNOTE 4.5+)扩展为 64 位以支持更大的载荷。
- 浏览器实现:JSZip / fflate 通过 `arrayBuffer()` 读取每个 `File`,在内存中构建归档,然后以 `Blob` 下载流式输出——无需服务器上传。
示例
项目文件打包
输入: src/、package.json、README.md(数十个文件)
输出: project-2026-06-11.zip(单个压缩包,deflate 压缩)
用途: 把一份快照分享给同事,或附到发布版本中多文件传输(减少开销)
输入: 100 张小图,每张 5-50 KB(共约 3 MB)
输出: photos.zip(一个文件、一次 HTTP 请求,没有逐文件的开销)
用途: 向按文件计费的邮件或存储服务上传大量小文件时使用文档归档整理
输入: invoice.pdf、contract.docx、signed-acknowledgement.png
输出: documents-2026Q2.zip
用途: 按留存政策把税务、法务或人事记录打包成带日期的归档文件常见问题
打包 ZIP 时数据会被上传吗?
不会。ZIP 文件通过 JSZip 在浏览器中创建。原始文件由 FileReader API 读取,本地压缩后以下载形式提供,全程不经过网络。
默认使用哪一级压缩?
默认使用 DEFLATE 级别 6,速度与体积兼顾,与多数 ZIP 工具一致。纯文本内容(日志、JSON、源码)压缩率较高;已经压缩过的内容(JPEG、MP4、ZIP)几乎无法再缩小。
可以加密码吗?
JSZip 不支持加密的 ZIP 条目。即便某个版本提供密码保护,通常采用的是 ZipCrypto,这种算法被普遍认为不安全,几十年前就已被破解。如需真正的密码保护,请使用桌面版 7-Zip 并选择 AES-256。
文件数量和大小有限制吗?
实际上限取决于浏览器内存。多数桌面浏览器可以处理几百 MB 的总量;移动端浏览器更紧张。对于超大批量打包,请使用桌面工具(7-Zip、WinRAR、命令行 zip),它们会从磁盘流式读取,而不是一次性载入内存。
文件夹结构会被保留吗?
会。从文件系统拖入文件夹时,相对路径会在 ZIP 中保留。页面可能会显示树形视图,方便你在生成前确认结构。
Windows、macOS 和 Linux 都能正常打开 ZIP 吗?
可以。JSZip 生成的是标准 ZIP 文件。UTF-8 文件名在现代系统上通用;非常老的 Windows 版本如果强制使用非 UTF-8 代码页,可能会把中文或日文文件名显示为乱码。现代 macOS 和 Linux 始终能正确处理 UTF-8。
ZIP 与 7Z 有什么区别?
ZIP 使用 DEFLATE 压缩,所有操作系统都能直接读取。7Z 使用 LZMA/LZMA2,对文本的压缩率明显更高,但需要 7-Zip 或兼容软件才能解压。本页面只输出 ZIP 格式。