[PHP] ZipArchiveを使った展開(解凍)

ZipArchiveとは

  • 圧縮形式のZipを作成・カスタマイズ・解凍するためのクラス
  • 元々はPECLだったが、PHP 5.2.0以降は標準で使える
  • リンク

展開について

各種パスなどについてわかりづらいので、まとめておく。

[php]
$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’;
}
[/php]

(1)

Zipファイルを開く。

ここでは、requireなどと同じく、絶対パスでも最初に実行されたファイルからの相対パスでもOK。

成功すればtrueが、失敗すれば各種エラーコードが返る。

(2)

Zipファイルを展開。

第1引数:展開先のディレクトリを指定。絶対パス・相対パス、どちらでもOK。

Zipファイルがある場所からの相対パスというわけではない。あくまでrequireなどと同じ。

第2引数:展開対象のZip内のファイルを指定。ディレクトリのみの展開はできない。

複数ファイルを指定する場合は、配列にして渡す。

自分の環境では、先頭にスラッシュ「/」をつけるとうまく動かなかった。

ファイルをひとつずつ展開

#numFilesでZip内のファイル数を、#getNameIndexで各ファイル名をとれるのを利用する。

[php]
for ($i = 0; $i < $zip->numFiles; ++$i) {
$file = $zip->getNameIndex($i);

// もしディレクトリだったらスキップ
if (substr($file, -1) == '/’) continue;

$zip->extractTo('./test’, $file);
}
[/php]

不具合?

圧縮形式が異なるのか、一部のZipファイルを展開できない。自分の環境では、WordPressのZipファイルがそれだった。

その他

他にも既存のZipファイルに特定のファイルを挿入するなど、けっこう使える印象。

PHP

Posted by takasho