Laravelでは画像はstorageフォルダに格納する
Webからのアクセスを許すには、public/storageからstorage/app/publicへシンボリックリンクを張る必要がある
https://readouble.com/laravel/6.x/ja/filesystem.html
### 駄目な例
moveコマンドで、public配下に格納
UsersController.php
if($file = $request->file('file')){ $name = $file->getClientOriginalName(); $file->move('./images/tmp/', $name); $inputs['path'] = $name;
### 格納先・読み込み元をstorageに修正
$ php artisan storage:link
// ./public/storageが./storage/app/publicへのリンクとなる
UsersController.php
if($file = $request->file('file')){ $name = $file->getClientOriginalName(); // $file->move('./images/tmp/', $name); $file->storeAs('./public/images/tmp/', $name); $inputs['path'] = $name;
confirm.blade.php
<img src="{{ $inputs['path'] ? asset('/storage/images/tmp/' . $inputs['path']) : 'https://placehold.jp/100x100.png' }}" class="img-icon">
確認画面で戻るボタンが押された場合は、Storage::deleteで削除する。確認画面で登録完了ボタンが押された場合は、画像の前部にCarbonでtimestampを付けて、prdフォルダに移動させる。画像のpathはDBに格納する。
UsersController.php
use Illuminate\Support\Facades\Storage; use Carbon\Carbon; public function store(Request $request) { $action = $request->get('action'); $inputs = $request->except('action'); if($action == '戻る'){ Storage::delete('public/images/tmp/'.$inputs['profile_img']); return redirect()->action('UsersController@create')->withInput($inputs); } $timestamp = Carbon::now()->timestamp; $path = $timestamp.'_'.$inputs['profile_img']; Storage::move('public/images/tmp/'.$inputs['profile_img'], 'public/images/prd/'.$path); return 'done'; }
ドキュメントを読む限り、storageに格納した方がファイルシステムの使う上で都合が良いように見えます。