[0030]PHPのZipArchiveを利用して複数ファイルを1つのzipにし、そのままダウンロード
■construct
Lalavel5.1 PHP5.6.31で動作確認済
まず、PHPのZIP拡張モジュールがインストールされているかssh接続し、確認します。
#PHPのZIP拡張モジュールがインストールされているか確認
% php -m | grep zip
#結果
% zip
説明は、XXXXController.php内のコメントを参照してください。
XXXXController.php
//ダウンロードするときの任意のzip名
$zipFileName = 'test.zip';
//圧縮したファイルを一時的に保存する任意のディレクトリ
$zipDir = '/file_up/tmp/';
set_time_limit(0);
//ZipArchive開始 $zipは任意
$zip = new \ZipArchive();
//openの引数に、フルパス付きで指定
$result = $zip->open($zipDir.$zipFileName, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
//エラー処理
if( $result !== true ){
//エラー時の対応を記述
}
//ZIP圧縮するファイルを追加 今回の例ではサーバにある2ファイル
//サーバのフルパス付きでファイル名まで
$filepath = "/file_up/file/sample.jpg";
//フルパス無しでファイル名だけ
$filename=basename("sample.jpg");
//ZIP圧縮するファイルを追加
$zip->addFile($filepath,$filename);
//サーバのフルパス付きでファイル名まで
$filepath = "/file_up/file2/common/【株式会社XXX】Wi-Fiレンタルサービスについて.pdf";
//フルパス無しでファイル名だけ
$filename=basename("【株式会社XXX】Wi-Fiレンタルサービスについて.pdf");
//ZIP圧縮するファイルを追加 ファイル名が日本語だと化けるのでmb_convert_encoding
$zip->addFile($filepath, mb_convert_encoding($filename, 'CP932', 'UTF-8'));
//ZIP 出力
$zip->close();
//ダウンロード
header('Content-Type: application/zip; name="'.$zipFileName.'"');
header('Content-Disposition: attachment; filename="'.$zipFileName.'"');
header('Content-Length: '.filesize($zipDir.$zipFileName));
//ファイルを出力する前に、バッファの内容をクリア(ファイルの破損防止)
ob_end_clean();
echo file_get_contents($zipDir.$zipFileName);
//一時的に保存していたZIPファイルを削除する
unlink($zipDir.$zipFileName);