Laravelでファイルをダウンロードする方法

Laravel

こんにちは!

今回はLaravelでファイルをダウンロードする方法をご紹介します。

Laravelで開発を行っていると、ファイルのアップロードとダウンロード機能はかなりの高頻度で実装することになるかと思います。そこで、今回はLaravelを使ったダウンロード機能の実装方法に絞って解説していきたいと思います。

読者
読者

「Laravelでファイルをダウンロードする方法を知りたい」

このようにお考えの方には参考になるかと思います。

なお、ファイルのアップロード方法に関しては、以下の記事ですでにご紹介しています。ご興味があればぜひ見てみてくださいね。

Laravelで簡単に実装できる画像アップロードの方法

それでは、さっそくみていきましょう!

Laravelでファイルをダウンロードする方法

まずはルートの設定を行っていきます。

Route::get('/download/{filename}', 'DownloadController@download')->name('download');

次に、ダウンロード用のコントローラを作成します。

php artisan make:controller DownloadController

ダウンロードコントローラにダウンロード処理のメソッドを追加します。

<?php

namespace App\Http\Controllers;

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

class DownloadController extends Controller
{
    public function download($filename)
    {
        $file = storage_path('app/' . $filename);
        return response()->download($file);
    }
}

こちらのコードでは、storage/appディレクトリに置かれているファイルをダウンロードします。

最後にクライアントサイドの実装です。

以下はリンクを使用する場合です。

<a href="download/example.txt">ダウンロード</a>

フォームを使って実装することもできます。

<form action="download/example.txt" method="get">
        @csrf
    <button type="submit">ダウンロード</button>
</form>

お好きな方でどうぞ。

ファイルがS3に置かれている場合

ファイルがAWS S3に置かれている場合もほとんど同様の方法でダウンロードすることができます。

コントローラが以下のように変更になります。

use Illuminate\Support\Facades\Storage;

public function downloadFromS3($filename)
{
    // S3上のファイルのパスを取得
    $filePath = 's3://your-bucket-name/' . $filename;

    // ファイルが存在するか確認
    if (Storage::disk('s3')->exists($filePath)) {
        // ダウンロードさせるためのHTTPヘッダーを設定してファイルを返す
        return Storage::disk('s3')->download($filePath);
    } else {
        // ファイルが存在しない場合はエラーを返すなどの適切な処理を行う
        return response()->json(['error' => 'File not found.'], 404);
    }
}

Laravelはファイル操作が抽象化されているおかげで、ファイルの種類や保存場所などにほとんど影響受けずにダウンロード機能が実装できます。Laravel大好き。

最後に

今回はすでにLaravelプロジェクト内やAWS S3などにファイルが置かれている場合のダウンロード方法をご紹介してきました。

ただ、実際の実務では都度データベースからデータを取得してCSVを組み立ててダウンロードするなど、もう少し複雑です。

このような場合は、ライブラリを使ってダウンロード機能を実装することになるかと思います。

この辺りも今後記事にしていきたいと思います。

それでは、以上!

コメント

タイトルとURLをコピーしました