Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Laravel5.2 DBに登録済みのバイナリデータをダウンロードさせる

More than 3 years have passed since last update.

やりたいこと

Laravel5でDBに登録済のバイナリデータをダウンロードさせる。
Laravel5 publicディレクトリからファイルダウンロードする記事は出てくるが、DBに登録済のバイナリデータをダウンロードする方法についてはあまり記述がなかった。

環境

・Laravel 5.2
・Laravel/homestead v0.5.0
  ・Ubuntu 16.04
  ・PHP7
  ・Nginx
  ・MySQL等
参照URL:Vagrant box laravel/homesteadLaravel ドキュメント

前提条件

DBにバイナリデータが既に格納済。
Hogeテーブルに主キーとなるid、ファイルタイトルを格納するfile_title、バイナリデータを格納するfile_dataが存在する。

手順

1.DBからバイナリデータを取得する。
2.取得したバイナリデータをfile_put_contentsの第2引数に指定でファイルに書き込む。
第1引数はデータを書き込むファイルへのパスだが、存在しないファイルを指定しても新規作成されるので問題ない。
3.ヘッダーに拡張子を指定する。オリジナルの拡張子も使える。
4.レスポンスに返却する。

HogeController.php
    /**
     * 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

ProjectEuropa
PHPとかJavaScriptとか
yyphp
PHPerが毎週集まり、ざっくばらんに情報交換する雑談コミュニティ
https://yyphp.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away