Laravel ファイルをアップロードしてサーバーに保存する シンボリックリンク
Laravelで、ユーザーにファイルをアップロードさせ、 そのファイルを保存したい場合、以下のように書ける。
・formを用意する
<form method="POST" action="post" enctype="multipart/form-data"> @csrf <input type="file" id="file" name="file" class="form-control"> <button type="submit">アップロード</button> </form>
・コントローラー側でファイルを受け取り、保存する
$file = $request->file('file'); // ファイルを受け取る $file_name = $file->getClientOriginalName(); // ファイル名を取得 $file->storeAs('public', $file_name); // ファイルをstorage/app/public下に保存
ファイルは、storage/app/public/に保存される。
保存したファイルにアクセスしたい場合、当然storage/app/public/xxx.pdfのようにパスを指定したいが、 Laravelではpublic以外のディレクトリは外側から見れないようになっているため、 上記のパスではstorage下の保存ファイルに届かない。
ここで、コマンドプロンプトのLaravelプロジェクト直下で、シンボリックリンクを貼る。
$php artisan storage:link
これによって、public/storage/と、storage/app/publicが繋がる。
すなわち、
$file->store('public');
で保存されたファイルは
storage/app/public
public/storage/
の両方に同時に保存され、
public/storage/xxx.pdfを指定することでファイルにアクセスすることができる。