在PHP 中處理壓縮文件是一項常見的任務,尤其是在處理上傳的打包數據或自動化部署時。其中, zip_read()是ZipArchive的一個老舊接口,用於遍歷ZIP 文件中的每一個條目。儘管這種方式已經被面向對象的ZipArchive類替代得越來越多,但在某些特定的項目或兼容性需求下, zip_read()依舊具備實用價值。
本文將通過實際示例,逐步演示如何使用zip_read()函數讀取ZIP 文件中每一個條目的信息。
首先你需要一個ZIP 文件,可以是任意的文件集合,例如包含幾個.txt文件的壓縮包。我們假設你已經有一個名為example.zip的壓縮文件,並將其放置在服務器目錄中,例如:
/var/www/html/files/example.zip
PHP 提供了zip_open()函數來打開ZIP 文件,返回一個資源句柄。這個句柄將用於後續讀取條目。
<?php
$zipPath = '/var/www/html/files/example.zip';
$zip = zip_open($zipPath);
if (is_resource($zip)) {
echo "ZIP 文件打開成功。\n";
} else {
echo "無法打開 ZIP 文件。\n";
}
?>
一旦打開了ZIP 文件,我們可以使用zip_read()在其中迭代每一個條目。下面是完整的讀取過程:
<?php
$zipPath = '/var/www/html/files/example.zip';
$zip = zip_open($zipPath);
if (is_resource($zip)) {
while ($zipEntry = zip_read($zip)) {
$entryName = zip_entry_name($zipEntry);
echo "發現條目: " . $entryName . "\n";
if (zip_entry_open($zip, $zipEntry, "r")) {
$contents = zip_entry_read($zipEntry, zip_entry_filesize($zipEntry));
echo "內容預覽: " . substr($contents, 0, 100) . "\n\n";
zip_entry_close($zipEntry);
}
}
zip_close($zip);
} else {
echo "打開 ZIP 文件失敗。\n";
}
?>
在這段代碼中,我們通過zip_read()獲取當前條目,然後通過zip_entry_name()獲取文件名,並使用zip_entry_read()讀取文件內容。請注意,由於某些條目可能是二進製文件或大型文件,所以這裡只預覽前100 個字符。
假設你提供一個上傳接口,用戶上傳的ZIP 文件會被服務器解壓並檢查內容是否合法。你可以通過zip_read()遍歷文件,並查找是否存在特定文件名,如config.json :
<?php
$zipPath = '/var/www/html/uploads/user_upload.zip';
$zip = zip_open($zipPath);
$foundConfig = false;
if (is_resource($zip)) {
while ($zipEntry = zip_read($zip)) {
if (zip_entry_name($zipEntry) === 'config.json') {
$foundConfig = true;
break;
}
}
zip_close($zip);
}
if ($foundConfig) {
echo "上傳包中包含 config.json,符合要求。\n";
} else {
echo "缺少 config.json 文件,上傳無效。\n";
}
?>
zip_read()是過程式的舊接口,在新的項目中推薦使用ZipArchive 。
在高並發場景中,手動操作資源句柄時要特別小心文件句柄的釋放問題。
若使用Web 上傳文件功能,請確保php.ini中相關的上傳大小限製配置得當,例如upload_max_filesize和post_max_size 。
雖然zip_read()屬於較老的PHP ZIP 操作函數,但在某些場景下仍具有學習與使用價值。通過本文的示例,相信你已經了解瞭如何一步步地用zip_read()函數讀取ZIP 文件中的每一個條目,並應用於實際項目中,例如自動化內容校驗、上傳文件審查等。