ZIP 解壓縮
上傳 ZIP 壓縮檔,預覽和提取檔案,支援單獨下載或批次解壓
拖曳 ZIP 檔案到此處,或點選選擇檔案
支援 .zip 格式的壓縮檔
什麼是 ZIP 解壓縮?
ZIP 解壓縮用來開啟壓縮檔,並還原其中儲存的檔案。它適合在收到壓縮檔後先查看內容、只取其中某個檔案、核對檔名與大小,或在下載全部檔案前判斷這個包是否值得信任。對一般檔案來說,ZIP 解壓是無損的,解出的內容應與壓縮前一致;但解壓不代表內容安全。壓縮檔可能包含誤導性檔名、意外目錄、解壓後體積巨大的資料,或不應直接開啟的可執行檔。這個瀏覽器工具會在本機讀取壓縮檔,並允許下載選中的檔案,適合小型檢查和取少量檔案。它不會在磁碟上完整重建原始目錄樹,也不能取代對可疑壓縮檔的安全審查。
如何使用
如何使用
- 將 ZIP 檔案拖放到上傳區域,或點選「選擇 ZIP 檔案」按鈕
- 檢視壓縮檔內的檔案清單和檔案資訊
- 點選單一檔案旁的「下載」即可解壓縮該檔案
- 點選「全部解壓縮」將所有檔案下載為 ZIP 格式
解壓縮安全
- 下載解壓縮項目之前,請先檢視檔案清單,特別是當壓縮檔來自不明來源時。
- 請留意可執行檔、巢狀壓縮檔與可疑的檔案名稱。
使用場景
技術原理
讀取 ZIP 壓縮檔的順序與寫入相反。瀏覽器透過 File API(`file.arrayBuffer()`)將檔案接收為 `ArrayBuffer`,讀取器從檔案尾端反向掃描尋找 End of Central Directory 簽章 `0x06054b50`(PK\x05\x06)。EOCD 最多 22 位元組加上最多 65,535 位元組的可選註解,因此掃描視窗是有界的。EOCD 指向中央目錄的偏移量和大小,中央目錄為每個項目保留一個 File Header(`0x02014b50`)。每個 File Header 攜帶壓縮和未壓縮大小、CRC-32、壓縮方法、檔名以及對應 Local File Header(`0x04034b50`)的偏移量。讀取器可以直接尋址到任何個別項目,無需解析其前面的項目——這就是為什麼從數 GB 的備份中提取單一檔案速度很快。 解壓縮取決於方法位元組:`0x00` 為儲存(不壓縮,僅 memcpy),`0x08` 為 RFC 1951 定義的 DEFLATE(約佔實際壓縮檔的 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 位元串流加密,使用三個位元組的已知明文攻擊即可輕易破解,而現代的 WinZip AES-256(PKWARE APPNOTE 7.0)需要 AE-2 額外欄位配合 HMAC-SHA1 認證——這兩種方式都未在此實作。超過 4 GiB 的壓縮檔依賴 ZIP64 延伸的額外欄位來提供 64 位元的大小和偏移量,解析器必須讀取這些欄位而非 32 位元的中央目錄欄位。
- 解析順序:從檔案尾端反向掃描尋找 EOCD 簽章 `0x06054b50`(距末端最多 22 + 65535 位元組)→ 尋址到中央目錄 → 尋址到每個 Local File Header。
- 壓縮方法:`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 在瀏覽器中解壓內容,檔案永遠不會離開你的裝置。你可以一邊解壓、一邊在「網路」分頁確認沒有任何流量。
支援哪些 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 的工具重建 ZIP,或在桌面版 7-Zip 裡設定正確的字碼頁。
檔案大小上限是多少?
上限取決於瀏覽器記憶體。新型桌機可處理 1 GB 以上的 ZIP;行動瀏覽器大約在數百 MB 就會耗盡記憶體。若是極大型封存,請使用可從磁碟串流的桌面工具。
可以不解壓就預覽檔案內容嗎?
文字檔可以,貼上或點選任一項目即可預覽內容;圖片會以縮圖呈現;二進位項目(執行檔、巢狀 ZIP)只顯示中繼資料,需下載後再檢視。
點檔(dotfile)與隱藏檔會被解出來嗎?
會。ZIP 並沒有「隱藏」這個屬性概念,所有項目都會被列出。以點開頭的檔名(.gitignore、.env)會照常解出,請當作一般檔案處理即可。