[PHP] ZipArchiveを使った展開(解凍)
ZipArchiveとは
- 圧縮形式のZipを作成・カスタマイズ・解凍するためのクラス
- 元々はPECLだったが、PHP 5.2.0以降は標準で使える
- リンク
展開について
各種パスなどについてわかりづらいので、まとめておく。
$zip = new ZipArchive; $result = $zip->open(file.zip'); // (1) if ($result != true) { echo 'error'; return; } if ( $zip->extractTo('./test', 'sample/abc.txt') ) { // (2) echo 'success'; }else { echo 'failure'; }
(1)
Zipファイルを開く。
ここでは、requireなどと同じく、絶対パスでも最初に実行されたファイルからの相対パスでもOK。
成功すればtrueが、失敗すれば各種エラーコードが返る。
(2)
Zipファイルを展開。
第1引数:展開先のディレクトリを指定。絶対パス・相対パス、どちらでもOK。
Zipファイルがある場所からの相対パスというわけではない。あくまでrequireなどと同じ。
第2引数:展開対象のZip内のファイルを指定。ディレクトリのみの展開はできない。
複数ファイルを指定する場合は、配列にして渡す。
自分の環境では、先頭にスラッシュ「/」をつけるとうまく動かなかった。
ファイルをひとつずつ展開
#numFilesでZip内のファイル数を、#getNameIndexで各ファイル名をとれるのを利用する。
for ($i = 0; $i < $zip->numFiles; ++$i) { $file = $zip->getNameIndex($i); // もしディレクトリだったらスキップ if (substr($file, -1) == '/') continue; $zip->extractTo('./test', $file); }
不具合?
圧縮形式が異なるのか、一部のZipファイルを展開できない。自分の環境では、WordPressのZipファイルがそれだった。
その他
他にも既存のZipファイルに特定のファイルを挿入するなど、けっこう使える印象。