### index.blade.php
aタグでは、actionでコントローラへリンクします。その際に、S3のファイルを指定するための引数を渡します。
<a href="{{ action('HogesController@download', $data->id) }}">{{ substr($data->attachment_file }}</a>
### route
ルーティングはgetメソッドで大丈夫です。
Route::get('/download/{id}', 'HogesController@download');
### controller
1. 渡ってきた引数($id)を元に、DB保存してあったS3のファイル名(ファイルパス)を取得します。
2. ファイルのmimeTypeを取得し、ContentTypeに指定します。
3. headerを指定してreturnで返します。
public function download($id){ $data = Data::where('id', $id)->first(); $file_path = '/hogehoge/prd/'.$data->attachment_file; $mimeType = Storage::disk('s3')->mimeType($file_path); $file_name = $data->attachment_file; $headers = [ 'Content-Type' => $mimeType, 'Content-Disposition' => 'attachment; filename="'. $file_name. '"' ]; return \Response::make(Storage::disk('s3')->get($file_path), 200, $headers); }
てっきりDownloadの処理はview側で書くのかと思いましたが、コントローラーに引数を渡してコントローラーで処理する方が一般的のようです。
しかし、S3のディレクトリ構造をどのようにして、ディレクトリ名・ファイル名のどこまでをDBに保存するか悩みます🤔🤔🤔