🙌

Laravelで会員登録者のみ見れるファイルを上手に扱う(PDF・動画)

2021/08/16に公開

会員登録者のみが見れるPDFとか動画とかってありますよね。
普通にpublic配下に置いたら、URLを知っていれば誰でもアクセスできちゃいます。

なので、public配下においてはいけません。
ではどうすればいいか?これから説明していきます。

今回は、videosテーブルに動画ファイルパスを保存している想定でいきます。

ビデオファイルを会員しか見れないようにする

FileSystemのlocalにファイルを保存しておく

普通はアップロード機能を作ってStorageのlocalディスクにファイルを保存するのですが、ここは省きます。

localディスクは php artisan storage:link でもシンボリックリンクが貼られない場所なので、ここに保存してもpublicの方には行きません。
通常誰からもアクセスできない場所です。

ローカルディスクのファイルにアクセスするためのルーティングを作成

web.phpにこのように記述します。

videoIdを使用してどのファイルを取得したいかを伝達します。

Route::middleware(['auth'])->group(function () {
    Route::get('/video/{video}', [VideoController::class, 'getVideo']);
});

ビュー側からこのルートにアクセスするとファイルが手に入るようになります。
しかもauhtミドルウェアをかけているので会員しかアクセスできません。

VideoControllerを作成する

VideoControllerを作成します

<?php

namespace App\Http\Controllers;

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

class VideoController extends Controller
{
    public function getVideo(Video $video)
    {
        if (Storage::exists($video->video_path)) {
            return Storage::download($video->video_path);
        }

        abort(404);
    }
}

ビュー側の処理を書く

ビュー側では普通にvideoタグを使用します

<video src="/video/1" controls></video>

これで動画がビューに表示されるようになります。

【補足】 PDFはどうすれば良い?

PDFも同じプログラムでいけます。
指定のルートにアクセスするとPDFがダウンロードできるようになります!

Discussion