こんにちは!
今回は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を組み立ててダウンロードするなど、もう少し複雑です。
このような場合は、ライブラリを使ってダウンロード機能を実装することになるかと思います。
この辺りも今後記事にしていきたいと思います。
それでは、以上!
コメント