在PHP 中處理ZIP 壓縮文件是一個常見的任務,尤其在處理上傳文件或自動歸檔時非常實用。 PHP 的Zip 擴展提供了一套完整的API 來操作ZIP 文件,其中zip_read()是用於遍歷ZIP 文件中條目的關鍵函數。本文將演示如何使用zip_read()函數逐個讀取並提取ZIP 文件中的每個文件內容。
在開始之前,請確保你的PHP 環境已啟用Zip 擴展。你可以通過以下命令檢查是否啟用:
<?php
phpinfo();
?>
在頁面中搜索Zip ,如果存在則說明已經啟用。如果沒有,請根據你的操作系統安裝並啟用該擴展。
使用zip_read()的基本步驟如下:
使用zip_open()打開ZIP 文件。
使用zip_read()遍歷每一個條目。
使用zip_entry_name()獲取條目名稱。
使用zip_entry_open()和zip_entry_read()讀取條目內容。
可選:將讀取的內容寫入文件實現提取操作。
以下是一個完整示例,逐個讀取ZIP 文件中的每個文件並將其提取到指定目錄:
<?php
$zipFile = 'archive.zip'; // 假設該文件位於當前目錄
$extractTo = 'extracted_files/';
// 確保目標目錄存在
if (!is_dir($extractTo)) {
mkdir($extractTo, 0755, true);
}
// 打開 ZIP 文件
$zip = zip_open($zipFile);
if (is_resource($zip)) {
while ($zipEntry = zip_read($zip)) {
$entryName = zip_entry_name($zipEntry);
$entryPath = $extractTo . $entryName;
// 忽略目錄條目,僅處理文件
if (substr($entryName, -1) === '/') {
continue;
}
// 尝试打開条目
if (zip_entry_open($zip, $zipEntry, "r")) {
$entryContent = zip_entry_read($zipEntry, zip_entry_filesize($zipEntry));
// 確保目錄結構存在
$dir = dirname($entryPath);
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
}
// 寫入到文件
file_put_contents($entryPath, $entryContent);
// 可選:輸出當前處理的文件
echo "已提取文件: $entryName<br>";
zip_entry_close($zipEntry);
}
}
zip_close($zip);
echo "ZIP 文件處理完成。";
} else {
echo "无法打開 ZIP 文件。";
}
?>
zip_read()每次讀取一個條目,需要在循環中多次調用以讀取所有條目。
使用zip_entry_filesize()獲取文件大小以便讀取完整內容。
必須使用zip_entry_open()才能讀取條目的內容。
如果ZIP 文件中存在多層目錄,提取前應確保目錄結構存在。
在線文檔解壓處理:上傳壓縮包後自動解壓到服務器特定目錄。
批量圖片處理:解壓用戶上傳的ZIP 文件中的圖片,存入/uploads/目錄供後續處理。
內容備份與還原:系統自動打包數據備份並支持逐文件提取恢復。