當前位置: 首頁> 最新文章列表> 如何使用zip_read 配合zip_open 遍歷並讀取Zip 文件中的每個條目?

如何使用zip_read 配合zip_open 遍歷並讀取Zip 文件中的每個條目?

M66 2025-06-23

在PHP 中處理Zip 壓縮包是一項非常常見的任務,尤其是在處理用戶上傳的壓縮文件或者打包數據文件時。 ZipArchive是現代PHP 推薦的操作類,但在某些特定場景或老版本PHP 中, zip_openzip_read等函數依然廣泛使用。本文將介紹如何通過zip_open配合zip_read遍歷並讀取一個Zip 文件中的所有條目內容。

基礎函數介紹

PHP 提供了一組用於操作Zip 文件的底層函數,包括:

  • zip_open($filename) :打開一個Zip 文件,返回一個Zip 句柄。

  • zip_read($zip) :讀取下一個條目,返回一個條目資源。

  • zip_entry_name($entry) :獲取條目的名稱。

  • zip_entry_open($zip, $entry) :打開一個條目。

  • zip_entry_read($entry, $length) :讀取打開的條目的內容。

  • zip_entry_close($entry) :關閉當前打開的條目。

這些函數允許我們以流的方式訪問每個壓縮包中的文件。

示例代碼

下面是一個完整的示例,展示如何使用這些函數來讀取一個Zip 文件中的所有條目內容:

<code> $zipFile = '/path/to/your/archive.zip';

$zip = zip_open($zipFile);

if (is_resource($zip)) {
while ($entry = zip_read($zip)) {
$entryName = zip_entry_name($entry);
echo "正在讀取條目: " . $entryName . PHP_EOL;

     if (zip_entry_open($zip, $entry, "r")) {
        $content = '';
        while ($buffer = zip_entry_read($entry, 1024)) {
            $content .= $buffer;
        }

        echo "內容如下:" . PHP_EOL;
        echo $content . PHP_EOL;

        zip_entry_close($entry);
    } else {
        echo "無法打開條目: " . $entryName . PHP_EOL;
    }
}
zip_close($zip);

} else {
echo "無法打開Zip 文件。" . PHP_EOL;
}
</code>

使用場景

  • 用戶上傳壓縮包解讀:比如用戶上傳了一些照片或文本文件作為壓縮包,我們可以使用上述方法讀取每一個文件的內容並保存到服務器。

  • 批量配置文件讀取:某些自動化部署系統會將多個配置文件打包為Zip,通過遍歷讀取可以提取需要的信息。

  • 數據遷移和備份恢復:讀取備份壓縮文件中的每個數據項,並寫入目標系統。

注意事項

  1. zip_open相關函數是PHP 的ZIP 擴展提供的,需要確保你的PHP 環境已經啟用該擴展。

  2. 這些函數適用於簡單的壓縮包處理,對於加密壓縮包或複雜結構,建議使用ZipArchive

  3. zip_entry_read默認最大讀取長度建議設置為1024 或其他合適值,防止內存開銷過大。

  4. 對於用戶上傳的文件,要小心處理路徑和內容,防止Zip 裝置攻擊(Zip Slip)。

實際應用舉例

假設有一個壓縮包由前端上傳至服務器地址為:

<code> https://m66.net/uploads/data.zip </code>

你可以將其保存到本地後使用本文代碼進行處理,並對壓縮包內容進行分類或存儲。

總結

通過zip_openzip_read ,PHP 提供了一種低層但靈活的方式來逐個遍歷Zip 文件中的條目。雖然在現代開發中ZipArchive更加推薦使用,但這些基礎函數在某些特定環境下仍然具有實用價值。理解其工作原理有助於在處理壓縮文件時更具掌控力與靈活性。