在 Web 開發中,使用者上傳壓縮檔並自動解壓是常見需求。PHP 內建的 Zlib 擴展雖能處理 gzip,但無法直接操作 ZIP 格式。本文介紹一種經典做法:結合檔案上傳與伺服器端命令列工具,實現 ZIP 自動解壓。
利用 PHP 的 exec() 或 system() 執行系統指令,呼叫 pkunzip.exe(或 Linux 下的 unzip)完成解壓縮。流程如下:
.zip 或 .ZIP。upload.php<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>ZIP 上傳解壓示範</title></head>
<body>
<form enctype="multipart/form-data" action="upsave.php" method="post">
<p>請選擇 *.ZIP 檔案,上傳後將自動解壓縮:</p>
<input type="file" name="MyFile" size="50">
<br><br>
<input type="submit" value="上傳">
<input type="reset" value="重填">
</form>
</body>
</html>
upsave.php<?php
// 1. 接收上傳檔
$filename = basename($_FILES['MyFile']['name']);
$tmp_name = $_FILES['MyFile']['tmp_name'];
if (!move_uploaded_file($tmp_name, $filename)) {
die('檔案上傳失敗,請檢查目錄寫入權限。');
}
// 2. 判斷是否為 ZIP
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
if ($ext === 'zip') {
// Windows 環境需放置 pkunzip.exe 於同目錄
// Linux 環境請改用: unzip -o {$filename}
$cmd = "pkunzip.exe -e {$filename}";
exec($cmd, $output, $retVar);
if ($retVar === 0) {
unlink($filename); // 解壓成功刪除原檔
echo "解壓完成!";
} else {
echo "解壓失敗,錯誤代碼:{$retVar}";
}
} else {
echo "非 ZIP 檔案,已保留原檔:{$filename}";
}
?>
pkunzip.exe 放在網站根目錄或系統 PATH 內。unzip,直接呼叫即可。escapeshellarg() 過濾檔名,防止命令注入。php.ini 的 upload_max_filesize 與 post_max_size)。PHP 5.2+ 內建 ZipArchive 類別,無需外部程式即可解壓,跨平台、更安全:
<?php
$zip = new ZipArchive;
if ($zip->open($filename) === TRUE) {
$zip->extractTo('./extracted/');
$zip->close();
unlink($filename);
echo '解壓成功';
} else {
echo '無法開啟 ZIP 檔';
}
?>
建議新專案優先使用 ZipArchive,僅在舊環境無法安裝擴展時採用命令列備案。
透過「上傳 → 判斷 → 呼叫外部工具 → 清理」四步驟,即可快速實現 ZIP 線上解壓。若專案允許,強烈建議改用 ZipArchive 以提升可維護性與安全性。