[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