画像のアップロード処理を作っている。
画像というかファイル全般なのだが、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)]) }}">
というようにするとよいよ。