🚀
【Laravel】複数のファイルをZIPでまとめてダウンロード
使用するライブラリ
このライブラリは、ZIPファイルを作成し、出来たところから同時にストリーミング形式でダウンロードさせるというもので、メモリとCPUの消費をおさえることができます。
「maennchen/ZipStream-PHP」というライブラリをLaravel用に使いやすくしてくれたもののようです。
使い方
$ composer require stechstudio/laravel-zipstream
$ composer install
あとは以下のようにuse宣言して使用するだけで簡単に実装できます。
use STS\ZipStream\ZipStreamFacade AS Zip;
class ZipController {
public function build()
{
return Zip::create("package.zip", [
"/path/to/Some File.pdf",
"/path/to/Export.xlsx"
]);
}
}
実装サンプル
use STS\ZipStream\ZipStreamFacade AS Zip;
class ZipController
{
public function build()
{
// 対象File取得
$files = File::get();
$filePaths = [];
// ZIP化するにあたりダウンロードさせたいファイルのフルパスが必要な為、配列で作成
$download_dir = '/work/application/storage/app/test'
foreach($files as $file) {
$filePaths[] = $downloads_dir.'/'.$file->getName(); // ファイル名を取得してフルパスを作成
}
// 完成時のzipファイルの名前
$zipname = 'download.zip';
// zipファイルを指定ディレクトリに作成
Zip::create($zipname, $filePaths)
->saveTo($download_dir . '/zip');
$fullpath = $download_dir . '/zip/' . $zipname;
// 作成されたzipファイルをダウンロードしてディレクトリから削除
return response()->download($fullpath, basename($fullpath), [])->deleteFileAfterSend(true);
}
}
サンプルではディレクトリなど直書きですが、実際はよしなにconfigファイルやenvファイルから参照する形の方が良いと思います。
宣伝
パーソンリンクではエンジニアを募集しています!
Discussion