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を指定することでファイルにアクセスすることができる。