はじめに
Laravel sail を使い開発をおこなっていて、画像を登録する機能の実装をしていたところ。
画像の保存ができているのに、表示ができない???
と少しはまってしまいましたので解決方法を共有いたします。
確認したこと
まず確認することはファイルパスが間違っていないか。
ファイルパスを確認したところ
/storage/uploads/hogehoge.png
正しく保存ができていました。
念の為シンボリックリンクの再作成を行いました。
rm public/storage
php artisan storage:link
ls -l public
次にシンボリックリンクの確認をしましょう。
シンボリックリンクの確認のためにLaravel/Public配下を確認したところ
Storage/uploadsもしっかりと存在していた。
問題があった箇所
Laravel Sailの使用
Laravel Sailを使用している場合、ホストマシンとDockerコンテナの間で適切にポートがマッピングされていることを確認してください。また、Dockerコンテナ内でシンボリックリンクが正しく作成されていることも確認してください。
との記事を発見し、確認してみました
./vendor/bin/sail bash
ls -la public
を実行し確認します。
すると
lrwxr-xr-x 1 sail dialout 63 Aug 13 17:31 storage -> /Users/hoge/project/Laravel/storage/app/public
となっていました!!
解決策
以下のコードで既存のシンボリックリンクを削除し、
新しくシンボリックリンクを作成してあげれば
rm public/storage # 既存のシンボリックリンクを削除
ln -s ../storage/app/public public/storage # 新しいシンボリックリンクを作成
lrwxr-xr-x 1 sail dialout 21 Aug 22 04:08 storage -> ../storage/app/public
と正しいシンボリックリンクを作成できました!!
開発環境での動作確認もしっかりと画像が表示されました!
最後に
Dockerコンテナ内からホストマシンのファイルシステムへのシンボリックリンクは、コンテナ内で正しく機能しない場合があります。特に、Docker for Macではこのような問題がよく発生します。
という文献も見つけました。
みなさんもMacで開発していてはまった時一度確認してみてください!
さぁ!今日も元気にコード書いてこ