現在の位置: ホーム> 最新記事一覧> phpのzip_read()関数を使用して、zipファイルの各ファイルを1つずつ読み取りして抽出する方法は?

phpのzip_read()関数を使用して、zipファイルの各ファイルを1つずつ読み取りして抽出する方法は?

M66 2025-06-23

PHPでのzip圧縮ファイルの処理は一般的なタスクです。特に、アップロードファイルまたは自動アーカイブを処理する場合に役立ちます。 PHPのZIP拡張機能は、ZIPファイルを操作するためのAPIの完全なセットを提供します。ZIP_READ ()は、ZIPファイルのエントリを通過するために使用される重要な関数です。この記事では、 zip_read()関数を使用して、zipファイルの各ファイルコンテンツを1つずつ読み取り、抽出する方法を示します。

1。環境準備

開始する前に、PHP環境にzip拡張機能が有効になっていることを確認してください。それが有効になっているかどうかを確認できます。

 <?php
phpinfo();
?>

ページでzipを検索します。存在する場合は、有効になります。そうでない場合は、オペレーティングシステムに従って拡張機能をインストールして有効にします。

2。基本的なプロセスの概要

zip_read()を使用する基本的な手順は次のとおりです。

  1. zip_open()を使用してzipファイルを開きます。

  2. zip_read()を使用して、各エントリをトラバースします。

  3. zip_entry_name()を使用して、エントリ名を取得します。

  4. zip_entry_open()zip_entry_read()を使用して、エントリコンテンツを読み取ります。

  5. オプション:読み取りコンテンツをファイルに書き込み、抽出操作を実行します。

3.サンプルコード分析

ZIPファイルの各ファイルを指定されたディレクトリに1つずつ読み取り、抽出する完全な例を次に示します。

 <?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 書類。";
}
?>

4。注意すべきこと

  • zip_read()は、一度に1つのエントリを読み取ります。すべてのエントリを読み取るには、ループで複数回呼び出す必要があります。

  • zip_entry_filesize()を使用して、ファイルサイズを取得して完全なコンテンツを読み取ります。

  • zip_entry_open()を使用して、エントリの内容を読み取る必要があります。

  • ZIPファイルにディレクトリの複数のレイヤーがある場合は、抽出前にディレクトリ構造が存在することを確認してください。

5。アプリケーションシナリオの例

  1. オンラインドキュメント減圧処理:圧縮パッケージをアップロードした後、サーバー固有のディレクトリに自動的に減圧されます。

  2. バッチ画像処理:ユーザーがアップロードしたzipファイルの写真を解凍し、後続の処理のために/ uploads /ディレクトリに保存します。

  3. コンテンツバックアップと復元:システムは、データバックアップを自動的にパッケージ化し、ファイルごとの抽出と回復をサポートします。

6。拡張読み取り