[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';
}
Contents

(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ファイルに特定のファイルを挿入するなど、けっこう使える印象。

PHP

Posted by takasho