画像アップロードの仕方
laravelでは画像をアップロードして保存する際に
public function store(Request $request) {
$filename = $req->imgpath->getClientOriginalName();
$img = $req->imgpath->storeAs('', $filename);
}
のようにして保存できるのですが、その時のフォルダは
storage/app
になっているようです。僕が保存したときは上記のフォルダに保存されました。
#アップロードした画像を表示
表示はとても簡単です。
<img src="{{ asset('storage/{ファイル名}') }}"/>
これで普通なら表示できるのですが、何も表示されないと思います。
理由は簡単asset関数
はpublicフォルダを参照するからそもそもフォルダ違うよねということです。
ではどうするのか。
シンボリックリンクをしてあげましょう。
#シンボリックリンク
シンボリックリンクとは特定のフォルダへのエイリアスとかポインタのようなものだと思っていただければと思います。
laravelではシンボリックリンクは超簡単にできます。
php artisan storage:link
このコマンドを打つだけです。
$ls -la public
なんやかんやの表示 storage -> /Users/ryotakarita/Desktop/sample-upload-pic/storage/app/public
こんな感じでstorage->~~~
の部分が表示されていたらOKです。
さあ、これで問題なく表示されるでしょう!といいうことでリロード!
あれ、表示されない...
#本題
なぜ表示されないのでしょうか?
冒頭を見返していただくとわかると思いますが、アップロードしたファイルの保存先は
storage/app
です。
シンボリックリンクされているパスと違いますよね。
#解決策
保存する際のstoreAs関数
の第一引数にpublic
を指定してあげる。
以下のようにするということです。
public function store(Request $request) {
$filename = $req->imgpath->getClientOriginalName();
$img = $req->imgpath->storeAs('public', $filename);
}
またはシンボリックリンクのリンク先を変更することでも解決できます。
変更の仕方はconfig/filesystems.php
内の最後にある
'links' => [
public_path('storage') => storage_path('app'),
],
のように修正してもできます。
一応これでもできるよという解決方法なのでいいやり方かどうかはわかりませんが。。。
また、リンク先を変更した際は
php artisan storage:link
を忘れないでください。
もしすでにリンクしている方は一度publicフォルダ
内のstorage
(リンクされているやつ)を削除するとエラーなくできると思います。
最後に
なかなか解決に時間がかかりましたが少し理解が深まったのでよしとします。
間違い、ご指摘等ございましたらコメントにてご教授ください。