PHPを使用してzip圧縮ファイルを処理する場合、 zip_read()は、圧縮ファイルのエントリを1つずつ読み取る共通の関数です。ただし、実際のアプリケーションでは、多くの開発者がこの関数をループで使用するとエラーが発生しやすく、読み取りが失敗したり、ロジックが誤っていません。この記事では、 zip_read()を正しく使用して、圧縮パッケージ内のすべてのファイルを読み取る方法について説明します。
PHPは、zip_open() 、 zip_read() 、 zip_entry_read()などのzipファイル操作に関連する一連の関数を提供します。ここで、 zip_read()は、順番に開いているzipファイルリソースのエントリを読み取るために使用されます。
圧縮されたファイルの内容を読み取るための典型的なコード構造は次のとおりです。
<code> $ zip = zip_open( "emple.zip"); if(is_resource($ zip)){while($ entry = zip_read($ zip)){echo "name:"。 zip_entry_name($ entry)。 "\ n"; if(zip_entry_open($ zip、$ entry、 "r")){$ contents = zip_entry_read($ entry、zip_entry_filesize($ entry));エコー「コンテンツ:」。 $ contents。 "\ n"; zip_entry_close($ entry); }} zip_close($ zip); } else {echo "zipファイルを開くことはできません"; } </code>上記のコードでは、 zip_open()が圧縮パッケージを開き、 zip_read()は、エントリがなくなるまでwhileループで1つずつ読み取ります。
zip_read()は、ループで継続的に呼び出されません
一部の開発者は、すべてのエントリを一度に読み取ることができると誤って考えているか、 foreach構造を使用してzip_read()を操作しようとしますが、これは実行不可能です。 ZIP_READ()は、すべてを正しく反復するために、時間ループに配置する必要があるシーケンシャルな読み取り関数です。
入力またはzipファイルが閉じていません
zip_entry_close()とzip_close()を呼び出すのを忘れて、特に大きなファイルまたは複数のzipパッケージを扱う場合、リソースの漏れにつながる可能性があります。
圧縮パッケージ内のファイルの問題のないエンコード問題
ZIPファイルに非UTF-8エンコードされたファイル名が含まれている場合、 ZIP_ENTRY_NAME()がGarled Codeを表示する可能性があります。 mb_convert_encoding()を使用してトランスコード:
<code> $ filename = mb_convert_encoding(zip_entry_name($ entry)、 "utf-8"、 "cp936"); </code>アップロードされたzipファイルがあるとしますが、すべてのファイルを分解してローカルアップロード/ディレクトリに保存する必要があります。
<code> $ zip = zip_open($ _ files ['file'] ['tmp_name']); if(is_resource($ zip)){while($ entry = zip_read($ zip)){$ name = zip_entry_name($ entry); $ save_path = "uploads/"。 Basename($ name); if (zip_entry_open($zip, $entry, "r")) {
$contents = zip_entry_read($entry, zip_entry_filesize($entry));
file_put_contents($save_path, $contents);
zip_entry_close($entry);
}
}
zip_close($zip);
echo "減圧が完了しました";
} それ以外 {
エコー「アップロードされたファイルを開くことはできません」;
}
</code>
オンラインで展開するときは、パス、許可を確認し、パストラバーサル(ディレクトリトラバーサル)攻撃を防ぐために安全に処理することを忘れないでください。
zip_read()がエントリを正しく返すかどうかわからない場合は、デバッグステートメントを追加できます。
<code> var_dump($ entry); </code>さらに、ファイル名を印刷して、解析されたコンテンツを確認することもできます。
<code> echo "reading file:"。 zip_entry_name($ entry)。 "\ n"; </code>PHPでzip_read()を使用してzipファイルを読み取るときは、次のポイントに注意してください。
while($ entry = zip_read($ zip))ループ;
読み取り後にzip_entry_open()とzip_entry_close()を使用します。
最後に、 zip_close()を呼び出してリソースを閉じます。
ファイル名のエンコードとディレクトリのセキュリティの問題に注意してください。