當前位置: 首頁> 最新文章列表> 如何用PHP 的zip_read() 函數一步步讀取Zip 文件中的下一個條目?

如何用PHP 的zip_read() 函數一步步讀取Zip 文件中的下一個條目?

M66 2025-07-04

在PHP 中處理壓縮文件是一項常見的任務,尤其是在處理上傳的打包數據或自動化部署時。其中, zip_read()ZipArchive的一個老舊接口,用於遍歷ZIP 文件中的每一個條目。儘管這種方式已經被面向對象的ZipArchive類替代得越來越多,但在某些特定的項目或兼容性需求下, zip_read()依舊具備實用價值。

本文將通過實際示例,逐步演示如何使用zip_read()函數讀取ZIP 文件中每一個條目的信息。

1. 準備一個ZIP 文件

首先你需要一個ZIP 文件,可以是任意的文件集合,例如包含幾個.txt文件的壓縮包。我們假設你已經有一個名為example.zip的壓縮文件,並將其放置在服務器目錄中,例如:

 /var/www/html/files/example.zip

2. 打開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";
}
?>

3. 使用zip_read() 遍歷條目

一旦打開了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 個字符。

4. 一個實際應用場景示例

假設你提供一個上傳接口,用戶上傳的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";
}
?>

5. 注意事項

  • zip_read()是過程式的舊接口,在新的項目中推薦使用ZipArchive

  • 在高並發場景中,手動操作資源句柄時要特別小心文件句柄的釋放問題。

  • 若使用Web 上傳文件功能,請確保php.ini中相關的上傳大小限製配置得當,例如upload_max_filesizepost_max_size

6. 結語

雖然zip_read()屬於較老的PHP ZIP 操作函數,但在某些場景下仍具有學習與使用價值。通過本文的示例,相信你已經了解瞭如何一步步地用zip_read()函數讀取ZIP 文件中的每一個條目,並應用於實際項目中,例如自動化內容校驗、上傳文件審查等。