質問するログイン新規登録
Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

287閲覧

画像が表示されません【Laravel】

Java_student

総合スコア87

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2023/08/24 09:39

編集2023/08/25 08:11

0

0

実現したいこと

画像投稿機能の実装を目指しているのですが、ストレージに保存された画像をトップページに表示されることが出来ません。
ストレージに保存された画像を表示させるコードの書き方が、以下で適切かを見て貰えないでしょうか?

前提

ストレージに画像を保存することは出来ています。

発生している問題・エラーメッセージ

画像が表示されずに四角い写真のマークが出ております。

該当のソースコード

home.blade.php

1@extends('layouts.app') 2 3@section('content') 4 @auth 5 <div class="container"> 6 logged in!</br> 7 <a href="{{ route('post.create') }}">掲載</a> 8 </div> 9 @foreach($posts as $post) 10 <div class='card'> 11 <a href="/posts/{{$post['id']}}"> 12 <img src='{{ Storage::url($post->image)}}' width="100px"></br> 13 @if($post->gender == 'オス') 14 {{ $post['name'] }}くん</br> 15 @else 16 {{ $post['name'] }}ちゃん</br> 17 @endif 18 </a> 19 </div> 20 @endforeach 21 @else 22 <div class="container"> 23 home 24 </div> 25 @endauth 26@endsection

HomeController

1<?php 2 3namespace App\Http\Controllers; 4use App\Models\Post; 5use Illuminate\Http\Request; 6use Illuminate\Support\Facades\Auth; 7use Illuminate\Support\Facades\DB; 8 9class HomeController extends Controller 10{ 11 /** 12 * Create a new controller instance. 13 * 14 * @return void 15 */ 16 public function __construct() 17 { 18 $this->middleware('auth'); 19 } 20 21 /** 22 * Show the application dashboard. 23 * 24 * @return \Illuminate\Contracts\Support\Renderable 25 */ 26 public function index() 27 { 28 $posts = Post::all(); 29 return view('home', ['posts' => $posts]); 30 //return view('home'); 31 } 32}

web.php

1<?php 2 3use Illuminate\Support\Facades\Route; 4use App\Http\Controllers\PostsController; //投稿機能 5 6/* 7|-------------------------------------------------------------------------- 8| Web Routes 9|-------------------------------------------------------------------------- 10| 11| Here is where you can register web routes for your application. These 12| routes are loaded by the RouteServiceProvider and all of them will 13| be assigned to the "web" middleware group. Make something great! 14| 15*/ 16 17Route::get('/', function () { 18 return view('home'); 19 //return view('welcome'); 20}); 21 22//Sass(デザイン) 23URL::forceScheme('https'); 24 25//トップページ 26//ユーザー 27Auth::routes(); 28//サインアップ・ログイン後の遷移 29Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); 30 31//投稿 32Route::get('/create', [App\Http\Controllers\PostController::class, 'create'])->name('post.create'); 33Route::post('/posts', [App\Http\Controllers\PostController::class, 'store'])->name('post.store'); 34 35//投稿を押した時 36Route::post('/post', [App\Http\Controllers\PostController::class, 'store'])->name('post.store'); 37

PostController

1<?php 2 3namespace App\Http\Controllers; 4use App\Models\Post; 5use Illuminate\Http\Request; 6use Illuminate\Support\Facades\Auth; 7use Illuminate\Support\Facades\Validator; 8 9class PostController extends Controller 10{ 11 public function index() 12 { 13 // データベース内のすべてのpostを取得し、post変数に代入 14 $posts = Post::all(); 15 // 'posts'フォルダ内の'index'viewファイルを返す。 16 // その際にview内で使用する変数を代入します。 17 return view('posts/index', ['posts' => $posts]); 18 } 19 20 public function show($id) 21 { 22 $post = Post::find($id); // idでPostを探し出す 23 return view('posts.show', ['post' => $post]); 24 } 25 26 public function create () 27 { 28 return view('posts/create'); 29 } 30 31 public function new() 32 { 33 return view('post/new'); 34 35 } 36 37 public function destroy($id) 38 { 39 $post = Post::find($id); 40 $post->delete(); 41 return redirect('/posts'); 42 } 43 44 public function store(Request $request) 45 { 46 //ユーザーIDを取得 47 $user_id = Auth::id(); 48 // 新しい Item を作成 49 $post = new Post; 50 // フォームから送られてきたデータをそれぞれ代入 51 $post->user_id = $user_id; 52 $post->name = $request->name; 53 54 //画像投稿の記述 55 $post->image = $request->image->store('images'); 56 57 $post->age = $request->age; 58 $post->gender = $request->gender; 59 $post->explanation = $request->explanation; 60 // データベースに保存 61 $post->save(); 62 return redirect('/'); 63 } 64 65 protected function validator(array $data) 66 { 67 return Validator::make($data, [ 68 'name' => ['required', 'string', 'max:255'], 69 'image' => ['file', 'mimes:gif,png,jpg,webp', 'max:3072'], 70 ]); 71 } 72}

試したこと

画像の表示のさせ方、コードの書き方を調べて、記述したのですが、うまく画像を特定できていないのでしょうか?

補足情報(FW/ツールのバージョンなど)

php: 8.1.21
laravel: 10.18.0

!追記!
コンソールから画像が表示されない原因を探ってみたところ、下記の表示がありました。

4CkuxLJ5p5wzf4VkTosZIIxLOSKmfcIiiIWJJ8Gt.jpg:1 Failed to load resource: the server responded with a status of 404 (Not Found)

画像が格納されているファイルを見つけられなかったといった類のエラーのように見えましたが、合っていますでしょうか?

サーバーのエラーログを確認しました。

[previous exception] [object] (Error(code: 0): Undefined constant \"image\" at /home/ec2-user/environment/mysite-test/storage/framework/views/f4b7cd1ceb841d5254e4ac3758f1773e.php:6) [stacktrace]

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

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

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

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

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

AbeTakashi

2023/08/24 10:05

ブラウザやサーバのログはどのようになっているのでしょうか? ソースコードと「画像が表示されない」という情報だけでは、第三者には何が起きているのかが分かりませんので、回答が出てくるのは厳しいかと思います。 不具合を判断する際に一番役に立つ材料として、ブラウザのコンソールに出てくるログやサーバのエラーログ(ApacheもしくはNginxのログ、Laravel上のログ)が非常に参考になります(404エラーならサーバのログの方がより具体的に原因が書かれてると思いますので、なるべくはサーバのログを参考にしてください)。こちらの内容をまずは確認して、それでも原因が判断できない場合は、そのログの内容を質問文内に追記してください。ログの情報があれば回答が出てくる可能性はあります。
Java_student

2023/08/24 15:14

コンソールから調べた事を追記させて頂きました。 情報が足りなかったら、さらに調べて追記させて頂きます。
AbeTakashi

2023/08/24 15:27

404エラーですね。ということで、前回のコメントにも書きましたが、サーバ側のエラーログも見てみてください。こちらの方がより具体的な理由でNot Foundになってるかの理由が書いてあります。URLのパス情報からここにあると期待されてるファイルシステム上のパスと、実際にファイルがあるパスに相違があるためと思われますので、その情報を元に解決を図る方向になるかと思います。
Java_student

2023/08/24 19:22

ありがとうございます。調べてみます。 ちなみに画像はstorage/app/images/$post->imageに保存してあり、画像のパスを表示させてみたところ、images/icMIKLHFmM2tPHJSqqUlVw43I4q6dYXdwYDOJ76r.jpgと表示されたました。 storageやapp等の指定も必要かを調べてみます。
Java_student

2023/08/25 04:45

サーバーのログを確認したところ、[previous exception] [object] (Error(code: 0): Undefined constant \"image\" at /home/ec2-user/environment/mysite-test/storage/framework/views/f4b7cd1ceb841d5254e4ac3758f1773e.php:6) [stacktrace]と表示されたのですが、こちらのエラーの原因や対処や修正などを調べたのですが、分かりませんでした。
AbeTakashi

2023/08/25 06:04 編集

↑この情報は質問文側に追記した方が良いと思います。 エラーが出てるファイルはviewのテンプレートが吐き出しているphpだと思いますが、Undefined constant \"image\"であれば、$post->image が間違っているということではないでしょうか? コントローラー内で$postsの中身をトレースするなどしてデバッグされると良いかと思います。ただ、このエラーはおそらく404とは別のエラーな気もします(404エラーの場合は明示的に404のレスポンスコードとその直接的な原因が書いてあるはずです)。他のログも含めてもう少し包括的に不具合を調べた方が良さそうです。
Java_student

2023/08/25 08:17

また調べてみます。 画像の投稿を保存する記述をPostControllerのstoreアクションに書き込んでいるのですが、そこが可笑しいのでしょうか? $post->image = $request->image->store('images'); 現在は sorageーappーimagesー画像 のような流れで投稿した画像が入っているのですが、ここの保存の仕方はおかしいのでしょうか? 調べると、storageフォルダーの中に画像を保存させる流れだったと思ったのですが。
AbeTakashi

2023/08/25 09:07

ちょっと分かりませんが、DBに格納してる$request->image->store('images')という文字列と、Storage::url($post->image)でパスとして展開される際に使用される文字列が上手く合致してないとか、そうういうことが起きてるような気もします。 まずはデバッグ作業として、View側で変数ではなく直接Storage::url('画像のパス文字列')などで画像が表示されるか?などを試してみるなどして、実際に画像が表示されたら、データベースに格納されている文字列とどう違うか?などを検証されたらどうでしょうか。
Java_student

2023/08/25 15:25

直接、画像をstorage/app/images/画像にもstorage/画像にも入れて試してみたのですが、どちらも表示されることはありませんでした。 もしかしたらstorageが使用できていない状況なのかもしれないと思ったのですが、storageはphp artisan storage:linkで利用できるようになると思ったのですが、そこに関しては適切でしょうか?
Java_student

2023/08/25 16:23

appファイルにあるpublicファイルでは表示されました。 またconfigにあるfilesystems.phpのlocalにある、ストレージの保存先の変更によってstorage/app/public/images/画像に設定を変更して、画像が表示できるようなパス指定を探ってみます。
AbeTakashi

2023/08/25 16:35

php artisan storage:linkでpublic以下にシンボリックリンクができているでしょうか? OSが書かれていないので何とも言えませんが、Windowsだと管理者権限が必要になる場合があるようです。 参考) https://qiita.com/shioharu_/items/608d024c48d9d9b5604f シンボリックリンクが問題なくできているのなら、念のためApacheの設定でシンボリックリンクが使える設定になっているかも念のため確認した方がいいでしょう。 デバッグの方向性としては正しいと思うので、何とか原因を見つけられるように頑張ってください。 参考) https://kkayataka.hatenablog.com/entry/2013/05/13/221333
Java_student

2023/08/25 17:02

ありがとうございます。 投稿を行い、storage/app/public/imagesに入った画像パスを特定して、imgを書いたところ、表示されました。これで投稿して保存されたファイルが表示されることが分かったのですが、srcでうまくとパスを指定できていません。 調べてみたところ、下記のサイトがヒントになるような事を書いていたのですが、store('images')で画像を保存するのが良くないとのことですが、storeAsでうまく登録できないので、現状はstoreで登録にしています。 ちなみに表示された投稿の画像はfilesystem.phpのlocalにあるroot' => storage_path('app/public/images'),で保存させて、特定の画像のファイル名をしてして行ったら表示されました。
Java_student

2023/08/25 17:03

ちなみにOSはAmazon Linux release 2 (Karoo)です。 Cloud9を使用しています。
guest

回答1

0

自己解決

filesystems.phpのlocalにあるストレージへの保存先を変更しました。

Config/filesystems.php

1'root' => storage_path('app/public'),

また画像の表示のパス指定は下記に行う事で表示されました。

home.blade.php

1<img src="{{ asset('storage/' . $post['image']) }}">

投稿2023/08/25 17:10

Java_student

総合スコア87

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問