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

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

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

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

Q&A

解決済

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

yc-www10
yc-www10

総合スコア17

Laravel

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

1回答

0グッド

0クリップ

331閲覧

投稿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>

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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

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

回答1

0

自己解決

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

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

投稿2022/11/17 11:57

yc-www10

総合スコア17

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Laravel

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