質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

1回答

1292閲覧

laravel本番環境でアップロードした画像が表示されません

yc-www10

総合スコア17

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2022/11/16 14:28

編集2022/11/16 23:37

前提

ローカル環境では正常に動作していたのですが、サーバーに上げたら、アップロードした画像が表示されなくなりました。原因をご教示頂きたいです…

実現したいこと

現状は、管理画面で画像をstorage/app/public/imagesにアップロードする仕組みになっていて、サーバー上のstorage/app/public/imagesには画像がちゃんとあることを確認できています。
<img src="{{ asset('storage/images/'.$product->image1) }}">
で画像を表示できないです。
ターミナルのssh接続でサーバー上のシンボリックリンクを確認しましたが、The links have been created.と返ってきました。

public/storage/imagesに手動で画像をアップロードすると表示されます。
こちらを管理画面の画像アップロードから表示できるようにしたいのです。

初めてlaravelを本番環境に上げたので、どうしたらいいかわかりません。
ご教示よろしくお願いいたします。

form

1<form method="post" action="{{ route('admin.product.store')}}" enctype="multipart/form-data" autocomplete="off"> 2 {{csrf_field()}} 3 <ul class="input_wrapper"> 4 <li class="image"> 5 <input type="file" name="image1" id="img1" value="{{old('image1'')}}"> 6 </li> 7 </ul> 8</form> 9

controller

1use App\Models\Product; 2 3 public function store(Request $request){ 4 if($request->file('image1')!=null){ 5 $file_name = $request->file('image1')->getClientOriginalName(); 6 $image1 = $file_name; 7 $request->file('image1')->storeAs('public/images' , $image1); 8 }else{ 9 $image1 = null; 10 } 11 Product::create([ 12 'image1' => $image1, 13 ]); 14 return redirect('/admin/product')->with('products', Product::get())->with('message','追加しました'); 15

view

1<img src="{{ asset('storage/images/'.$product->image1) }}">

htaccess

1プロジェクトディレクトリ直下に置いています。 2<IfModule mod_rewrite.c> 3 <IfModule mod_negotiation.c> 4 Options -MultiViews 5 </IfModule> 6 7 RewriteEngine On 8 9 RewriteCond %{REQUEST_FILENAME} -d [OR] 10 RewriteCond %{REQUEST_FILENAME} -f 11 RewriteRule ^ ^$1 [N] 12 13 RewriteCond %{REQUEST_URI} (\.\w+$) [NC] 14 RewriteRule ^(.*)$ public/$1 15 16 RewriteCond %{REQUEST_FILENAME} !-d 17 RewriteCond %{REQUEST_FILENAME} !-f 18 RewriteRule ^ server.php 19 20</IfModule>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

phper.k

2022/11/16 15:03

ブラウザの開発ツールの「ネットワーク」タブで読み込もうとしているパスが正しいかを確認してください
m.ts10806

2022/11/16 20:40

実際のコードと構成を提示されたほうが良いと思います。
yc-www10

2022/11/16 23:34

失礼致しました。 実際のコードを追加しました。
AbeTakashi

2022/11/17 03:10

phper.kさん指摘の内容は確認済みですか? おそらくパスの問題か(シンボリックリンクの不具合の可能性も含む)、もしくはhttpsじゃなくてhttpになってるとか、その手の類いですよ。ブラウザのソースコードを見て、画像のURLが正しいかをまずは確認すべきです。
m.ts10806

2022/11/17 03:15

むしろ画像URLをアドレスバーで直アクセスしてみて表示されるかという確認もしたほうが良いですね。
yc-www10

2022/11/17 03:24

パスは、"https://ドメイン名/public/storage/images/ファイル名"でpublic/storageにアクセスされています。 現状public/storageには画像がなく、storage/app/publicには画像アップロードされています。 なので表示されず、public/storageに手動で画像を上げると表示されます。 ローカルではstorage/app/publicとpublic/storageに画像が入るようになっていたので、やはりサーバー上でシンボリックリンクができていないのでしょうか… 画像URLにアクセスすると404エラーとなります。
phper.k

2022/11/17 03:28

> やはりサーバー上でシンボリックリンクができていないのでしょうか… サーバーにログインして確認すればわかるでしょ
AbeTakashi

2022/11/17 03:44 編集

ローカル環境のシンボリックリンクの張り方が違ってるんでしょうね。通常のやり方ならおそらくURLにpublic/とか付かないですので、ローカル環境で間違っててそれに合わせてしまったゆえ本番環境で表示されないのではないでしょうか? 第三者はそこまで分かりませんので、ご自身で確認・判断してください。
yc-www10

2022/11/17 03:36

一度確認し、すでにリンクされているとなっていたので、 他に原因があるのかと思いこちらで質問させていただきましたが もう一度確認したいと思います。
phper.k

2022/11/17 03:41

> 一度確認し、すでにリンクされているとなっていたので、 あなたが確認したのは、「シンボリックリンクがあるか」を確認したのであって、作成済みのシンボリックリンクが、どのディレクトリにリンクされているかを確認しなければ意味がありません。
AbeTakashi

2022/11/17 03:41

シンボリックリンクの張り方と<img src="{{ asset('storage/images/'.$product->image1) }}">の記載方法のどちらかが間違ってるのではないかと思います。何かしらパスの階層のズレが発生している可能性が高いので、どちらかを修正すれば一発で直りそうな感じはあります。ただ、本番環境とローカル環境の差異があると開発しにくいので、まずはその環境の差異をしっかり確認する方が良いかもしれません。
m.ts10806

2022/11/17 03:45

URLにpublicが入ってる時点でドキュメントルートの設定がおかしいような。 両環境で同じですか?
yc-www10

2022/11/17 05:23

すみません。 URLにpublicがあるのはhtaccessを試しに切って表示していたので、 実際は"https://ドメイン名/storage/images/ファイル名" が正しいです。
yc-www10

2022/11/17 05:26

>あなたが確認したのは、「シンボリックリンクがあるか」を確認したのであって、作成済みのシンボリックリンクが、どのディレクトリにリンクされているかを確認しなければ意味がありません 次はそちらを確認したいと思います。
guest

回答1

0

自己解決

再度シンボリックリンクを調べ、
最終的にサーバー上のpublic/storageフォルダを自分で削除し(ターミナル上ではディレクトリの削除がエラーでできなかったため)、ssh接続でもう一度シンボリックリンクを実行したら表示できるようになりました。
私はxserverを使っていたのですが、ドメイン/public_html上でphp artisan storage:linkで出来ました。

コメントいただいた皆様ありがとうございました。

投稿2022/11/17 11:57

yc-www10

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問