圧縮ファイルを処理するとき、PHPは.zipファイルの読み取りと操作をサポートする強力なzip拡張機能を提供します。この記事では、 ZIP_READ()関数の使用法を詳細に説明し、他の関連する関数と協力して、ZIPファイルの各エントリを通過し、その中のコンテンツまたは情報を抽出する方法を示します。
zip_read()を使用する前に、PHP環境にzip拡張機能が有効になっていることを確認してください。わからない場合は、次のコードを使用して、拡張機能がロードされているかどうかを確認できます。
<?php
if (class_exists('ZipArchive')) {
echo "Zip 拡張機能を有効にします";
} else {
echo "Zip 拡張機能が有効になっていません";
}
?>
返された結果が「zip拡張機能が有効になっていない」の場合、 php.iniファイルで関連する拡張子を有効にするか、phpのインストール時に-zipオプションを追加する必要があります。
ZIP_READ()は、ZIP_OPEN()およびZIP_ENTRY_*シリーズ関数と組み合わせて使用されます。その目的は、open .zipファイルのエントリを読むことです。各コールは、 falseが読み取るエントリがもうないことを示すまで、次のエントリのリソースハンドルを返します。
.zipファイルを開き、すべてのエントリを繰り返し、各エントリの名前とコンテンツを読む方法を示す完全な例を示します。
<?php
$zipFile = '/path/to/example.zip'; // あなたの地元のものと交換してください zip ファイルパス
$zip = zip_open($zipFile);
if (is_resource($zip)) {
while ($zip_entry = zip_read($zip)) {
echo "<strong>ファイル名:</strong> " . zip_entry_name($zip_entry) . "<br>";
if (zip_entry_open($zip, $zip_entry, "r")) {
$contents = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
echo "<strong>コンテンツプレビュー:</strong><br><pre>" . htmlentities(substr($contents, 0, 500)) . "</pre><hr>";
zip_entry_close($zip_entry);
}
}
zip_close($zip);
} else {
echo "圧縮ファイルを開くことができません。";
}
?>
zip_read()で使用される重要な関数は次のとおりです。
ZIP_OPEN(String $ filename) :zipファイルを開き、リソースハンドルを返します。
zip_read(リソース$ zip) :zipファイルリソースから次のエントリをお読みください。
ZIP_ENTRY_NAME(Resource $ entry) :現在のエントリのファイル名を取得します。
ZIP_ENTRY_OPEN(リソース$ ZIP、リソース$エントリ、String $ MODE) :エントリを開き、コンテンツの読み取りを準備します。
ZIP_ENTRY_READ(リソース$エントリ、int $ length) :現在開いているエントリのコンテンツを読み取ります。
ZIP_ENTRY_CLOSE(リソース$エントリ) :オープンエントリを閉じます。
ZIP_CLOSE(リソース$ ZIP) :ZIPファイルリソースを閉じます。
ユーザーが.zipファイルをアップロードできるシステムを構築する場合、違法なファイル名、ブラックリスト拡張機能のフィルタリングなど、アップロードされたファイルコンテンツをスキャンする必要がある場合があります。zip_read()を使用して、アイテムごとにトラバースとスクリーニングアイテムの関数を実装します。
例えば:
<?php
function scanZipForPhp($zipPath) {
$zip = zip_open($zipPath);
if (!is_resource($zip)) {
return false;
}
$suspicious = [];
while ($entry = zip_read($zip)) {
$name = zip_entry_name($entry);
if (preg_match('/\.php$/i', $name)) {
$suspicious[] = $name;
}
}
zip_close($zip);
return $suspicious;
}
$flaggedFiles = scanZipForPhp('/tmp/uploaded.zip');
if (!empty($flaggedFiles)) {
echo "疑わしいものが見つかりました PHP 書類:<br>";
echo implode('<br>', $flaggedFiles);
} else {
echo "未疑わしいものが見つかりました書類。";
}
?>
ZIP_READ()およびZIP_ENTRY_*シリーズ関数は、初期のPHPが提供するメソッドであり、低レベルのZIP操作に適しています。よりリッチな機能(ZIPファイルの作成、コメントの追加など)が必要な場合は、 Ziparchiveクラスを使用することをお勧めします。
zip_read()を使用すると、暗号化されたzipパッケージのコンテンツに直接アクセスできません。
zipファイルのコンテンツが大きい場合は、メモリオーバーフローを防ぐために、すべてのコンテンツを一度に読み取らないようにする必要があります。