ZIP圧縮ファイルを使用する場合、特にマルチレベルのディレクトリ構造を含む圧縮パッケージを減圧する場合、ターゲットディレクトリが存在することを確認することが非常に重要なステップです。それ以外の場合、宛先パスが存在しないため、ファイルが失敗する可能性があります。この記事では、 zip_read()関数を使用してzipファイルの各エントリを読み取り、 file_exists()とmkdir()を組み合わせて必要なディレクトリを自動的に作成し、安定したファイル抽出プロセスを実現する方法を紹介します。
PHP環境にZIP拡張機能が有効になっていることを確認してください。次のコードを使用して検出できます。
<?php
if (!class_exists('ZipArchive')) {
die('Zip 拡張機能が有効になっていません');
}
?>
以下は、ZIPファイルからファイルとディレクトリの読み取りを実装し、ディレクトリ構造を自動的に作成する完全なサンプルコードです。
<?php
$zipPath = 'example.zip'; // ZIP ファイルパス
$extractTo = 'output/'; // ディレクトリを解凍します
$zip = zip_open($zipPath);
if (!is_resource($zip)) {
die('開くことができません ZIP 書類');
}
while ($entry = zip_read($zip)) {
$entryName = zip_entry_name($entry);
$fullPath = $extractTo . $entryName;
// ディレクトリパスを取得します
$dir = dirname($fullPath);
// ディレクトリを自動的に作成します
if (!file_exists($dir)) {
mkdir($dir, 0777, true);
}
// 如果是書類,コンテンツを読んで書いてください
if (zip_entry_open($zip, $entry, "r")) {
$content = zip_entry_read($entry, zip_entry_filesize($entry));
file_put_contents($fullPath, $content);
zip_entry_close($entry);
}
}
zip_close($zip);
?>
zip_open()
zipファイルを開き、リソースハンドルを返すために使用されます。
zip_read()およびzip_entry_name()
zip_read()によって圧縮パッケージのエントリを1つずつ読み取り、zip_entry_name()を使用してエントリへの相対パスを取得します。
dirname()抽出ディレクトリパス
ファイルであろうとディレクトリであろうと、dirname()を使用してパスパーツを抽出し、ディレクトリが存在するかどうかを確認します。
file_exists()はmkdir()と組み合わせて使用されます
file_exists()は、ディレクトリが既に存在するかどうかを判断するために使用されます。
MKDIR()は、3番目のパラメーターを使用してTRUEを設定して、再レベルディレクトリを再帰的に作成します。
ファイルコンテンツを書き込み
現在のエントリがファイルの場合、宛先パスに開かれ、読み取り、書き込まれます。
http://m66.net/files/archive.zipから圧縮パッケージをダウンロードしたとします。減圧後、元の構造を保持したいと考えています。 $ zippathを変更するだけです:
$zipPath = 'http://m66.net/files/archive.zip'; // 知らせ:zip_open 直接使用はサポートされていません URL,最初にローカルエリアにダウンロードする必要があります
file_get_contents()およびfile_put_contents()を使用して、ファイルをローカルに保存できます。
$tempZip = 'temp_archive.zip';
file_put_contents($tempZip, file_get_contents('http://m66.net/files/archive.zip'));
次に、 $ zippathを$ tempzipに置き換えます。
zip_read() 、 file_exists() 、およびmkdir()を組み合わせることにより、パスの存在によって引き起こされるエラーを心配することなく、zipファイルコンテンツとディレクトリ作成の自動抽出を効率的に実装できます。この方法は、複雑なディレクトリ構造でZIPファイルを減圧し、スクリプトの堅牢性と使いやすさを改善するのに特に適しています。