當前位置: 首頁> 最新文章列表> 如何使用PHP 的zip_read() 函數實現逐個讀取和提取ZIP 文件中的每個文件?

如何使用PHP 的zip_read() 函數實現逐個讀取和提取ZIP 文件中的每個文件?

M66 2025-06-23

在PHP 中處理ZIP 壓縮文件是一個常見的任務,尤其在處理上傳文件或自動歸檔時非常實用。 PHP 的Zip 擴展提供了一套完整的API 來操作ZIP 文件,其中zip_read()是用於遍歷ZIP 文件中條目的關鍵函數。本文將演示如何使用zip_read()函數逐個讀取並提取ZIP 文件中的每個文件內容。

一、環境準備

在開始之前,請確保你的PHP 環境已啟用Zip 擴展。你可以通過以下命令檢查是否啟用:

 <?php
phpinfo();
?>

在頁面中搜索Zip ,如果存在則說明已經啟用。如果沒有,請根據你的操作系統安裝並啟用該擴展。

二、基本流程概覽

使用zip_read()的基本步驟如下:

  1. 使用zip_open()打開ZIP 文件。

  2. 使用zip_read()遍歷每一個條目。

  3. 使用zip_entry_name()獲取條目名稱。

  4. 使用zip_entry_open()zip_entry_read()讀取條目內容。

  5. 可選:將讀取的內容寫入文件實現提取操作。

三、示例代碼解析

以下是一個完整示例,逐個讀取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 文件中存在多層目錄,提取前應確保目錄結構存在。

五、應用場景舉例

  1. 在線文檔解壓處理:上傳壓縮包後自動解壓到服務器特定目錄。

  2. 批量圖片處理:解壓用戶上傳的ZIP 文件中的圖片,存入/uploads/目錄供後續處理。

  3. 內容備份與還原:系統自動打包數據備份並支持逐文件提取恢復。

六、擴展閱讀