laravelでrouteのパラメータにスラッシュが含まれるとき

画像のアップロード処理を作っている。
画像というかファイル全般なのだが、Fileというモデルで一括管理していて、保存先は

/storage/app/uploads

になっている。ここに保存した画像をどうやって表示するか、ということなのだけど、laravel本体はドキュメントルートの上に設置されているので、直接リンクしても表示されない。

ということで、表示用のrouteを作る。
イメージとしては

/files/ファイルのパス/ファイル名

みたいなURLで呼び出すと、その画像が表示されればいいかなと。
で、いざやってみると、ファイルのパスということでパラメータにスラッシュが入っているのでうまく動かないのだ。

base64_encode しないとだめなんだそうで。

ということで、web.php を、

use Illuminate\Support\Facades\Storage;

Route::get('/files/{filePath}', function ($filePath) {
    $filePath = base64_decode($filePath);
    $path = storage_path('app/' . $filePath);

    if (!Storage::disk('local')->exists($filePath)) {
        abort(404);
    }

    return response()->file($path);
})->name('files.show');

として、ビューの方は

<img src="{{ route('files.show', ['filePath' => base64_encode($user->file->filepath . '/' . $user->file->filename)]) }}">

というようにするとよいよ。