ZIP 解压缩
上传 ZIP 压缩包,预览和提取文件,支持单独下载或批量解压
拖拽 ZIP 文件到此处,或点击选择文件
支持 .zip 格式的压缩包文件
什么是 ZIP 解压缩?
ZIP 解压缩用于打开压缩包,并还原其中保存的文件。它适合在收到压缩包后先查看内容、只取其中某个文件、核对文件名和大小,或在下载全部文件前判断这个包是否值得信任。对于普通文件,ZIP 解压是无损的,解出来的内容应当与压缩前一致;但解压并不代表内容安全。压缩包可能包含误导性文件名、意外目录、解压后体积巨大的数据,或不应直接打开的可执行文件。这个浏览器工具会在本地读取压缩包,并允许下载选中的文件,适合小型检查和取少量文件。它不会在磁盘上完整重建原始目录树,也不能替代对可疑压缩包的安全审查。
使用方法
使用方法
- 将 ZIP 文件拖拽到上传区域,或点击「选择 ZIP 文件」按钮
- 查看压缩包内的文件列表及文件信息
- 点击单个文件旁的「下载」即可解压该文件
- 点击「全部解压」可将所有文件打包为 ZIP 下载
解压安全提示
- 下载解压文件前请先查看文件列表,尤其是压缩包来源不明时,务必多加留意。
- 对可执行文件、嵌套压缩包以及可疑文件名要保持警惕。
使用场景
技术原理
读取 ZIP 归档的过程与写入相反。浏览器通过 File API(`file.arrayBuffer()`)接收文件为 `ArrayBuffer`,读取器从文件尾部反向扫描寻找中央目录结束签名 `0x06054b50`(PK\x05\x06)。EOCD 最多 22 字节加上可选的最多 65,535 字节注释,因此扫描窗口是有界的。EOCD 指向中央目录的偏移量和大小,中央目录为每个条目保存一个文件头(`0x02014b50`)。每个文件头包含压缩和未压缩大小、CRC-32、压缩方法、文件名以及匹配的本地文件头(`0x04034b50`)的偏移量。读取器可以直接定位到任何单个条目,而无需解析其前面的条目——这就是从数 GB 的备份中快速提取单个文件的原因。 解压取决于方法字节:`0x00` 为存储(无压缩,仅 memcpy),`0x08` 为 DEFLATE(RFC 1951,约 99% 的归档),`0x0C` 为 BZIP2,`0x0E` 为 LZMA,`0x5D` 为较旧的 PPMd。此工具使用 JSZip(或用 fflate 获得更高吞吐量——fflate 的 `unzipSync` 可在数十毫秒内解码一个典型的 10 MB DEFLATE 归档,比 JSZip 快数倍)。解压后会重新计算原始字节的 CRC-32 并与中央目录中的值比较;不匹配表示数据损坏或被篡改。 任何提取代码路径都需要注意两个安全问题。第一个是 Zip Slip 漏洞(Snyk,2018):恶意归档可能包含带路径遍历序列(如 `../../etc/passwd`)的条目,将条目名称直接拼接到目标目录的朴素提取器会写入预期沙箱之外的位置。修复方法是使用 `path.resolve()` 规范化拼接后的路径,并在写入前验证它仍以目标目录开头。此工具通过 `URL.createObjectURL(new Blob([bytes]))` 将每个条目作为独立的浏览器下载提供,浏览器会将目标沙箱化,因此目录遍历无法逃出用户的下载文件夹,但同样的归档在服务端提取器上是可利用的。第二个是加密归档未处理:传统 ZipCrypto 是 32 位流加密,已知明文攻击仅需 3 个字节即可破解;现代 WinZip AES-256(PKWARE APPNOTE 7.0)需要 AE-2 额外字段和 HMAC-SHA1 认证——两者均未在此实现。超过 4 GiB 的归档依赖 ZIP64 扩展的额外字段提供 64 位大小和偏移量,解析器必须读取这些字段而非 32 位的中央目录字段。
- 解析顺序:从文件尾部反向扫描 EOCD 签名 `0x06054b50`(距末尾最多 22 + 65535 字节)→ 定位到中央目录 → 定位到每个本地文件头。
- 压缩方法:`0x00` 存储、`0x08` DEFLATE(RFC 1951,约 99% 的归档)、`0x0C` BZIP2、`0x0E` LZMA、`0x5D` PPMd。
- 完整性:使用多项式 `0xEDB88320`(反向 IEEE 802.3)的 CRC-32 对提取的字节重新计算,并与中央目录中的值比较。
- Zip Slip(Snyk 2018):包含 `../` 路径遍历的条目可能写入提取目录之外;修复方法是在写入前规范化并验证解析后的路径。
- 浏览器实现:`File.arrayBuffer()` → JSZip / fflate `unzipSync()` → 每个条目通过 `URL.createObjectURL(new Blob([bytes]))` 下载,无服务器往返。
- 加密未处理:ZipCrypto 在 3 个已知明文字节内即可破解;WinZip AES-256(APPNOTE 7.0,AE-2 额外字段配合 HMAC-SHA1)未在此实现。
- ZIP64(APPNOTE 4.5+)通过额外字段将 32 位大小/偏移字段扩展为 64 位;归档或单个条目超过 4 GiB(2³² − 1 字节)时必需。
示例
查看压缩包内容
无需安装解压软件,直接在浏览器中查看 ZIP 压缩包内的文件列表提取单个文件
无需解压全部内容,只下载你需要的那个文件批量解压
一键解压并下载压缩包内的所有文件常见问题
解压时 ZIP 会被上传吗?
不会。页面通过 FileReader API 在本地读取 ZIP,并使用 JSZip 在浏览器中解压条目。文件不会离开你的设备。你可以在解压时打开 Network 面板亲自确认。
支持哪些 ZIP 变体?
支持使用 DEFLATE 压缩的标准 ZIP 文件(最常见的变体)。Stored(未压缩)条目同样支持。多数版本支持 ZIP64(超过 4 GB 的归档)。加密条目(密码保护)以及 7Z、RAR、TAR 不支持,请使用专门工具处理。
可以解压加密的 ZIP 吗?
通常不行。JSZip 无法处理 ZipCrypto 加密或 AES 加密的条目。请先在桌面上用 7-Zip 或 WinRAR 解密,如果需要查看结构,可重新打包后在本页面打开。
如果 ZIP 中的文件名是中文或日文怎么办?
页面默认按 UTF-8 读取文件名。早期 Windows 创建的 ZIP 可能用 GBK(中文)或 Shift_JIS(日文)存储文件名,且未设置 UTF-8 标志,这种情况下会显示为乱码。请使用支持 UTF-8 的工具重新打包,或在桌面端 7-Zip 中选择正确的代码页。
文件大小有限制吗?
受限于浏览器内存。现代桌面浏览器能处理 1 GB 以上的 ZIP;移动端浏览器在几百 MB 时就可能耗尽内存。对于超大归档,请使用能够从磁盘流式读取的桌面工具。
可以不解压直接预览文件内容吗?
对于文本文件可以——粘贴或点击任一条目即可查看内容。图片以缩略图预览。二进制条目(可执行文件、嵌套的 ZIP)只显示元数据,需下载后再行检查。
点文件和隐藏文件会被解压吗?
会。ZIP 没有「隐藏」属性的概念,所有条目都可见。以点开头的文件名(如 .gitignore、.env)会正常解压,可作为普通文件处理。