ZipArchiveクラスでzipファイルを作るのは簡単でした。
以下のようなコードですぐに作ることができます。
// file open $zip = new \ZipArchive(); if($res = $zip->open($file_path, \ZipArchive::CREATE) !== true){ throw new \Exception("Zip open error!! File path: ".$file_path." Error code: ".(string)$res); } // add file foreach($files as $file){ if($zip->addFile($file, basename($file))== false){ $zip->close(); unlink($file_path); throw new \Exception("Zip add file error!! File path: ".$file_path." Error file: ".$file); } } $zip->close();
本当は「CSVファイルを作ってそれをパスワード付きZIPファイルにしてダウンロードする」ということをやりたかったのですが、なんと!ZipArchiveはパスワード付きのZIPを作れません。
setPassword()というメソッドがありますがパスワードが付いたZIPを解凍するときにしか使えません。
Windows上ではパスワードを付けるのを断念しました。Linux上では以下のようにコマンドを実行してやることでパスワードを付けられるようです。
exec("zip -jP $password $file1 $file2");
またZipArchiveはメモリ上のデータをZIP化できないようなので、CSVファイルを一度ファイルにしてからZIP化する必要があります。結局使わなくなったCSVファイルやZIPファイルは削除する必要があるのですが、ダウンロードが終わるまで消すこともできないのであとで消す処理が必要です。そんなわけでsys_get_temp_dir()を使って一時ファイルとして扱うことにしましたが、個人的にはテンポラリディレクトリの挙動が環境によると思われるので好きになれません。どれくらい容量を圧迫するのか、いつ消されるのかなど。
誰か良い方法があったら教えて欲しいです。
参考
ZipArchive クラス
sys_get_temp_dir