July 11, 2014

ZipArchiveを作成して中身のデータだけ取得する

PHPのZipArchiveは一旦ファイルシステム上にファイルを作成する必要がある。

// 一時ファイルを作成
$filename = tempnam(sys_get_temp_dir(), 'example-prefix');
$zip = new ZipArchive();
$ret = $zip->open($filename, ZipArchive::CREATE);
if ($ret === true) {
  // somedir/a.txtをa.txtという名前で追加
  if ($zip->addFile("somedir/a.txt", "a.txt") === false) {
    echo "error: failed to add a.txt\n";
  }
  // somedir/b.txtをb.txtという名前で追加
  if ($zip->addFile("somedir/b.txt", "b.txt") === false) {
    echo "error: failed to add b.txt\n";
  }
  $zip->close();
  $zipContent = file_get_contents($filename);
  unlink($filename); // 一時ファイルを削除

  // $zipContentにはzipファイルのバイナリデータが入っている
} else {
  echo "failed to open a zip file (code=$ret)\n";
}

一時ファイルをRAMディスク内に作成することもできるが、zipファイルのサイズが大きくなると容量が足りなくなる可能性があるので避けた方が無難。

Posted by Nao Iizuka <iizuka@kyu-mu.net>
Powered by Bitter