LoginSignup
0
1

More than 1 year has passed since last update.

laravelシンボリックリンクしても画像が表示されない

Last updated at Posted at 2022-01-09

画像アップロードの仕方

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(リンクされているやつ)を削除するとエラーなくできると思います。

最後に

なかなか解決に時間がかかりましたが少し理解が深まったのでよしとします。
間違い、ご指摘等ございましたらコメントにてご教授ください。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1