🙌
Laravelで会員登録者のみ見れるファイルを上手に扱う(PDF・動画)
会員登録者のみが見れる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