PHP Laravel:ファイルのダウンロード方法について

Table of Contents

Table of Contents

Laravelからファイルをダウンロードする

多くのウェブサイト、特にデータを分析したり保存したりするサイトでは、ユーザーが欲しいデータを自分のコンピューターに取り込めるように、ファイルをダウンロードするオプションが用意されていることがよくあります。 これから、Laravelでファイルのダウンロード方法、Arrayの内容をcsvファイルにしてエクスポートする方法を紹介します。

流れ

  • ダウンロード処理のControllerを準備する: ExportController
  • ファイルをダウンロードする2つの方法:
    • 方法1: Storage::download()
    • 方法2: response()->download()
  • Arrayの内容をcsvファイルにしてエクスポートする: response()->stream()

ExportController & web

まず ExportController を準備して、その中にdownload_storagedownload_response 関数も用意します。
後でそれぞれ Storage::download()response()->download() 関数を使用して、ファイルのダウンロード機能を実装します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class ExportController extends Controller
{

    public function download_storage(Request $request)
    {
        //...
    }

    public function download_response(Request $request)
    {
        //...
    }

}

また、web.phpの中にもルートも設定しましょう。


Route::get('/export/download_storage', [ExportController::class, 'download_storage'])->name('export.download_storage');
Route::get('/export/download_response', [ExportController::class, 'download_response'])->name('export.download_response');

方法1 Storage::download($filePath, $fileName, $headers)

Laravelプロジェクトのルートディレクトリ下の storage/app/public パスに test.png の画像ファイルを用意します。 次に、Storage::download()メソッドを使用して、画像ファイルをダウンロードします。

public function download_storage(Request $request)
{
    $filePath = 'public/test.png';
    $fileName = 'test.png';
    $mimeType = Storage::mimeType($filePath);
    $headers = [['Content-Type' => $mimeType]];
    return Storage::download($filePath, $fileName, $headers);
}

方法2 response()->download($filePath, $fileName, $headers)

同様に、Laravelプロジェクトのルートディレクトリ内のstorage/app/publicパスに、test.png画像ファイルを用意します。 response()->download() メソッドでファイルを取得し、ダウンロードします。

public function download_response(Request $request)
{
    $filePath = Storage::path('public/test.png');
    $fileName = 'test.png';
    $mimeType = Storage::mimeType($filePath);
    $headers = [['Content-Type' => $mimeType]];
    return response()->download($filePath, $fileName, $headers);
}

Arrayの内容をcsvファイルにしてエクスポートする

ここでは、response()->stream()メソッドと、callbackfopen()fputcsv() を用いて、csvファイルを作成しています。

public function csv_stream(Request $request)
{
    $response_headers = [
            'Content-type' => 'text/csv',
            'Content-Disposition' => 'attachment; filename=export.csv',
            'Pragma' => 'no-cache',
            'Expires' => 0,
        ];
        
        $results = [
            ['id', 'name', 'class'],
            [1, 'John', '1-A'],
            [2, 'Tom', '1-B'],
            [3, 'Mary', '2-A'],
            [4, 'May', '2-B'],
        ];
        $callback = function () use ($results) {
            $resource = fopen('php://output', 'w');
            foreach ($results as $row) {
                fputcsv($resource, $row);
            }
            fclose($resource);
        };
        return response()->stream($callback, 200, $response_headers);
}

web.phpにrouteを設定するのを忘れないでください。

Route::get('/export/csv_stream', [ExportController::class, 'csv_stream'])->name('export.csv_stream');