商品管理システムの作成をしており、DBにアップロードした画像を一覧に表示したいのですが、表示できません。
シンボリックリンクは実行しており、Public\storageに画像の保存もできております。
もちろんDBにもアップロードした画像のパスはあります。
storageの権限もフルアクセスにしてます。
Controller
1 2/** 3 * 商品登録画面を表示する 4 * 5 * @return view 6 */ 7 public function showCreate() 8 { 9 // INNAR JOIN 10 $products = \DB::table('products') 11 ->join('companies','products.company_id','=','companies.id') 12 ->get(); 13 14 return view('create.create', ['products' => $products]); 15 } 16 17/** 18 * 商品を登録する 19 * 20 * @return view 21 */ 22 public function exeStore(ProductRequest $request) 23 { 24 // 商品のデータを受け取る 25 $inputs = $request->all(); 26 27 $image = $request->file('image'); 28 29 // 画像がアップロードされていれば、storageに保存 30 if($request->hasFile('image')){ 31 $path = \Storage::put('/public', $image); 32 $path = explode('/', $path); 33 }else{ 34 $path = null; 35 } 36 37 \DB::beginTransaction(); 38 try { 39 // 商品を登録 40 Product::create($inputs); 41 \DB::commit(); 42 } catch(\Throwable $e) { 43 \DB::rollback(); 44 abort(500); 45 } 46 47 \Session::flash('err_msg', '商品を登録しました。'); 48 return redirect(route('products')); 49 } 50 51
Model
1 2<?php 3 4namespace App\Models; 5 6use Illuminate\Database\Eloquent\Model; 7 8class Product extends Model 9{ 10 //テーブル名 11 protected $table = 'products'; 12 13 // 可変項目 14 protected $fillable = 15 [ 16 'company_id', 17 'product_name', 18 'price', 19 'stock', 20 'comment', 21 'image', 22 ]; 23 24 // Companiesテーブルと関連付ける 25 public function company(){ 26 return $this->belongsTo(Company::class); 27 } 28} 29
CreateBlade
1 2<label for="image">商品画像登録</label> 3 <input type="file" class="form-control-file" name='image' id="image"> 4
ListBlade
1 2<img src="{{ '/storage/' . $product->image }}" class='w-100 mb-3'/> 3
エラー内容
[autoindex:error] [pid 26956:tid 1288] [client ::1:64175] AH01276: Cannot serve directory
##環境
Windows
PHP 7.4.16
MAMP
質問の内容を信じるとsrc間違えてるだけでしょう?って感じですが
そうではないならもうちょいログとか実際のディレクトリの状態とかファイルの一覧とか載せた方がいいんでないですか
サーバのエラーログを確認してみてください。404エラーが出ているのであれば、そこに原因がしっかり書かれている場合が多いです。hentaimanさんも書かれていますが、おそらくパスがずれてるとかそういう理由かと思います。
実際のディレクトリはシンボリックリンクを実行してからいじってないので、public\storageに画像が保存されています。
エラーログはlogsを確認しましたが出ていません。
一覧ページに反映されていないだけでエラーも出ていないので。。
うーん、ちょっと分からないですね。「画像が表示されない」というのが、曖昧な表現なので外部の人が見てもなんとも言えないです。Not Found(404)で画像が表示されないのであれば、すくなくともApacheもしくはLaravelのログに何かしらエラーが出てると思うのですが…。それが出てないのであればそもそもBladeテンプレートの書き方が間違っているとか? あと、$productとかいきなり出てきても、これも回答者から見るとちゃんとデータ入ってるのかな? とか思ってしまいます。
回答に必要な情報が全体的にちょっと足りない感じがあるので、コントローラーやテンプレートの省略してるところを付け足す、実際のディレクトリの情報を記載する(キャプチャ)、ブラウザのログ情報を記載する、など情報を付け足した方が良いと思います。
ログを確認したのですが、どのエラーがこれに対するエラーなのかわかりませんでした。。
DBに保存されている画像パスで開くと404にはなります。
Controllerは登録部分をすべてコピペします。
おそらくviewだとは思いますが、どこが原因かすらも見当がつかないので必要箇所があれば教えていただければ追記します。。
Laravel歴1か月もない初心者なので、質問すら下手ですみません。。
とりあえず↑に足りない情報は書きましたので、書けるところまで書いて頂ければと思います。
ただ、404ならログを見るのが一番早いはずです。サーバ側のエラーログの場所を見つける、ログが出てないならログを出す設定を入れるなどの方が解決の近道かもしれません。WindowsのMAMP環境は私もよく分かりませんので、MAMP環境に関する説明サイトなどを参考にしてログを出す方法を洗い出すといいと思います。
とりあえずModel部分追加しました。
Controllerも追加しました。
list.bladeではforeach文を使っています。
ログを確認しましたが、何ヶ所か同時進行して作成してしまっていてどのログがこれに対するエラーログか判断できません。
Apacheのエラーログで対象のエラーと思われるログが見つかったので追記しました。
エラー内容を調べましたがよくわからず、どうしたらいいのかわかりませんでした。
> DBに保存されている画像パスで開くと404にはなります。
404なのでsrcで指定しているパスが実在しないだけという事は分かりますよね?
質問者自身は正しいファイルパスを把握しているんですか?つまりブラウザに直接URL打って画像表示する事は出来るんですか?
直接入力で404になります。
新たにファイルの生成をしていないので、直接storageに入っているのでファイルパスは間違っていないはずです。
その言葉を信じるなら、シンボリックリンク張れてるか確認したらどうですか?
ってとこです
しかし絶対に間違いなくLaravelのマニュアル通りに画像アップシンボリックリンクの手順を進めているというのならシステム的な間違いは無いと思うので、やはりパスが間違っていないという予想が外れており、実際にはパスが間違っているから表示されないのです
って事になります
以上2パターンを疑いつつ確認してみては?
ありがとうございます。
シンボリックリンクは実行してあるのですが、実際に張れているかの確認が必要ということですか?
パスの設定も再度確認してみます。
hentaimanさんのコメントとほぼかぶりますが、シンボリックリンクが正しく張れていて画像の直URLを直接指定すれば、LaravelやPHPを経由せずとも、画像が正しく表示できるはずです。もし画像の直URLを直接叩いても画像が表示できないのであれば、それはおそらくシンボリックリンクが正しく張れていないか、パスを間違えているかどちらかの可能性が高いです。なので、そこを確認するのが先決かと思います。現状の情報を見る限りでは、おそらくLaravelに関係ないところで引っかかっていそうです。
かしこまりました。
再度パスやシンボリックリンクの確認をしてみます。。
あなたの回答
tips
プレビュー