【Laravel】複数のファイルをZIPでまとめてダウンロード


使用するライブラリ

stechstudio/laravel-zipstream

このライブラリは、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ファイルから参照する形の方が良いと思います。

宣伝

パーソンリンクではエンジニアを募集しています!

https://www.person-link.co.jp/recruit