やりたいこと
Laravel5でDBに登録済のバイナリデータをダウンロードさせる。
Laravel5 publicディレクトリからファイルダウンロードする記事は出てくるが、DBに登録済のバイナリデータをダウンロードする方法についてはあまり記述がなかった。
環境
・Laravel 5.2
・Laravel/homestead v0.5.0
・Ubuntu 16.04
・PHP7
・Nginx
・MySQL等
参照URL:Vagrant box laravel/homestead・Laravel ドキュメント
前提条件
DBにバイナリデータが既に格納済。
Hogeテーブルに主キーとなるid、ファイルタイトルを格納するfile_title、バイナリデータを格納するfile_dataが存在する。
手順
1.DBからバイナリデータを取得する。
2.取得したバイナリデータをfile_put_contentsの第2引数に指定でファイルに書き込む。
第1引数はデータを書き込むファイルへのパスだが、存在しないファイルを指定しても新規作成されるので問題ない。
3.ヘッダーに拡張子を指定する。オリジナルの拡張子も使える。
4.レスポンスに返却する。
/**
* Hogeファイルダウンロード実行Action
* download/{id}のURLのidから、Hogeテーブルの指定したidをキーとするファイルをDLする
*/
public function downloadHoge($id) {
$hoge = Hoge::where('id', '=', $id)->first();
// タイトル取得
$title = $hoge->file_title;
// バイナリデータ取得
$fileData = $hoge->file_data;
// 取得したバイナリデータをファイルに書き込んでレスポンスに返却
$writingHogeData = '.hoge';
file_put_contents($writingHogeData , $fileData);
// 拡張子はhoge
$headers = array(
'Content-Type: application/hoge',
);
return response()->download($writingHogeData, $title, $headers);
}
参考
PHPマニュアル:file_put_contents
stackoverflow:Download files in laravel using Response::download