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

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

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

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

PHP

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

Q&A

解決済

2回答

758閲覧

Laravelで画像投稿機能実装後、画像を投稿していないにも関わらず画像を取得しようとしてしまう

takamori

総合スコア7

Laravel

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

PHP

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

0グッド

0クリップ

投稿2020/04/02 17:43

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(Laravel)で簡易的なSNSを作っています。
画像投稿機能を実装したのですが、画像を投稿しなかった場合にも以下のように表示されてしまいます
イメージ説明

ご教授いただければ幸いです

HTML

1 <p> 2 {{ $post->body }} 3 </p> 4 5 <hr> 6 <a class= "sample" href="/users/{{ $post->user->id }}"> 7 <img src="/storage/post_images/{{ $post->id }}.jpg" class="card-img-bottom"> 8 </a>

ポストコントローラー

PostContoroller

1public function index() 2 { 3 $posts = Post::latest()->get(); 4 5 6 return view('post/index', ['posts' => $posts]); 7 } 8 public function new() 9 { 10 return view('post/new'); 11 12 } 13 14 public function store(Request $request) 15 { 16 //バリデーション 17 $validator = Validator::make($request->all() , ['caption' => 'required|max:255']); 18 19 //エラー 20 if ($validator->fails()) 21 { 22 return redirect()->back()->withErrors($validator->errors())->withInput(); 23 } 24 25 $post = new Post; 26 $post->caption = $request->caption; 27 $post->user_id = Auth::user()->id; 28 29 $post->save(); 30 31 if($request->photo == null){ 32 return redirect('/'); 33 } 34 35 else{ 36 $request->photo->storeAs('public/post_images', $post->id . '.jpg'); 37 38 return redirect('/'); 39 } 40 } 41} 42

試したこと

[PHPでファイルの存在を確認する関数の使い方を現役エンジニアが解説【初心者向け】]
(https://techacademy.jp/magazine/22088)
を参考に下記のコードで画像ファイルがある場合にaタグの中身を表示するようなif文を書いてみたのですが見た目は変わりませんでした

PHP

1 <?php 2 $filename = "/storage/post_images/{{ $post->id }}.jpg"; 3 if (file_exists($filename)) 4 ?> 5 <a class= "sample" href="#"> 6 <img src="/storage/post_images/{{ $post->id }}.jpg" class="card-img-bottom"> 7 </a>

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

Laravel Framework 5.5.48,
PHP 7.2.28
AWS Cloud9
mysql Ver 14.14 Distrib 5.7.26

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

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

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

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

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

guest

回答2

0

ベストアンサー

画像ファイルがある場合にaタグの中身を表示するようなif文を書いてみたのですが

Storage ファサードを使って以下のようにしてみてはいかがでしょうか。

PHP

1@if (Storage::exists("post_images/{$post->id}.jpg")) 2 <a class="sample" href="#"> 3 <img src="{{ Storage::url("post_images/{$post->id}.jpg") }}" class="card-img-bottom"> 4 </a> 5@endif

参考: Laravel 5.5 ファイルストレージ

投稿2020/04/03 11:45

Lulucom

総合スコア1899

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

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

takamori

2020/04/05 16:37

ありがとうございます! 解決しました
guest

0

HTML

1<a class= "sample" href="/users/{{ $post->user->id }}"> 2 <img src="/storage/post_images/{{ $post->id }}.jpg" class="card-img-bottom"> 3</a>

ここで条件なしに表示する表にしているのでそのような挙動は正常です。

これの回避策はいくつか考えられますが、
以下のようにセッションに結果を保存して、Bladeで表示するかどうかの判定をするのはいかがでしょうか?

PHP

1public function index() 2 { 3 $posts = Post::latest()->get(); 4 5 6 return view('post/index', ['posts' => $posts]); 7 } 8 public function new() 9 { 10 return view('post/new'); 11 12 } 13 14 public function store(Request $request) 15 { 16 //バリデーション 17 $validator = Validator::make($request->all() , ['caption' => 'required|max:255']); 18 19 //エラー 20 if ($validator->fails()) 21 { 22 return redirect()->back()->withErrors($validator->errors())->withInput(); 23 } 24 25 $post = new Post; 26 $post->caption = $request->caption; 27 $post->user_id = Auth::user()->id; 28 29 $post->save(); 30 31 if($request->photo == null){ 32 return redirect('/')->with('image', false); //->with..を追加 33 } 34 35 else{ 36 $request->photo->storeAs('public/post_images', $post->id . '.jpg'); 37 38 return redirect('/')->with('image', true); //->with..を追加 39 } 40 } 41}

HTML

1@if(session('image')) 2<a class= "sample" href="/users/{{ $post->user->id }}"> 3 <img src="/storage/post_images/{{ $post->id }}.jpg" class="card-img-bottom"> 4</a> 5@else 6画像はありません 7@endif

特にテストしていないので、エラーが出たり、動作しなかった場合は言ってください。

投稿2020/04/02 18:14

kyoya0819

総合スコア10429

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

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

takamori

2020/04/03 03:58 編集

回答ありがとうございます。 いただいたコードを以前のものと入れ替えてみたのですが、 画像を投稿した場合、以前のものと同じ挙動でした。 画像を投稿しなかった場合やページを更新した時に、全ての投稿に画像はありませんと出力されてしまい、以前投稿した画像も表示されなくなってしまいました。 ご教授いただければ幸いです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問