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

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

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

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

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

1回答

1971閲覧

【Laravel】リクエストには画像データが渡っているのにも関わらず、最終的にnullになる

Keight

総合スコア9

Laravel

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

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

1クリップ

投稿2020/05/09 23:12

編集2020/05/11 03:22

LaravelにてWebサービスを開発中です。
以前は問題なく画像が投稿できたいたのですが、なぜか突然(?)画像が投稿できなくなってしまいました。
ビューやコントローラーの中身がおかしくなっているのかと確認してみましたが、個人的に、特に怪しい箇所は見受けられませんでした。


lectures/show.blade.php

HTML

1@if ($lecture->image) 2 <figure class="show_post_thumbnail"><div class="new_area-img text-center"><img class="show_image" src="{{ asset('storage/'.$lecture->image) }}"></div></figure> 3@else 4 <figure class="show_post_thumbnail"><div class="new_area-img text-center"><img src="../img/noimage.gif"></div></figure> 5@endif 6```--- 7**LecturesController** 8```PHP 9public function store(Request $request) { 10 11 $this->validate($request, [ 12 'category_name' => 'required', 13 'title' => 'required|max:100', 14 'content' => 'required', 15 ]); 16 17 if($request->file('image')) { 18 $lecture = new Lecture; 19 20 $lecture->user_id = \Auth::id(); 21 $lecture->category_name = $request->category_name; 22 $lecture->title = $request->title; 23 $lecture->content = $request->content; 24 25 // リクエストされた image データ(View側の name)を $images に代入 26 $images = $request->file('image'); 27 28 // foreach で $images に入った画像を $image として別個に取り出す 29 foreach ($images as $image) { 30 31 // UNIXタイムスタンプを取得したものと、ユーザーID、オリジナルの拡張子を取得したものとを繋ぎ、ファイル名として $filename に代入 32 $filename = time() . '_' . $lecture->user_id . '.' . $image->getClientOriginalExtension(); 33 34 // storeAs の第1引数は storage からのパス、第2引数はファイル名、第3引数は利用するストレージ(local、public…など) 35 $path = $image->storeAs('', $filename, ['disk' => 'public']); 36 37 // パスを image カラムに代入 38 $lecture->image = $path; 39 40 // 最終的な状態を保存 41 $lecture->save(); 42 } 43 } 44 else { 45 $request->user()->lectures()->create([ 46 'category_name' => $request->category_name, 47 'title' => $request->title, 48 'content' => $request->content, 49 ]); 50 } 51 52 return redirect('/'); 53

dd($lecture-<image);で確認すると、「null」となっています。
イメージ説明

ただ、dd($request);としてみると、画像が渡ってきているみたいです。
イメージ説明

これは一体どういうことなんでしょうか?

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

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

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

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

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

satokei

2020/05/11 03:22

確認させてください。 - 画像はディレクトリに保存されていますか? - エラーは発生していないのでしょうか?(ログやtry-catchなどで確認)
Keight

2020/05/11 03:37

ご回答ありがとうございます。 ・画像のディレクトリというのは、storage/app/publicのことでしょうか? 画像を添付して投稿後、確認してみましたがその中には入っていないようです。 過去、画像を付けての投稿が問題なくできましたので、その際に投稿した画像が入っているのを確認できるだけですね。 https://gyazo.com/0b7f259d2de47948a9432d8c974a3abe コントローラー側、ビュー側でも、そのときの記述内容と何ら変えていないと思うのですが、なぜかこのような状況に陥っております???? ・画像を付けての投稿の際もエラー画面は特に出ませんが、トップページにリダイレクトされ、その投稿は反映されません。 一方で、画像を付けずにタイトルや本文だけを入力し投稿すると、きちんとその内容が反映されています。
meshi_s

2020/05/11 04:00

foreachを通っている確認はされましたか? また、「dd($lecture-<image);」はあってますか?
Keight

2020/05/11 04:11

ありがとうございます。 foreachを通っているかの確認とは、どのようにすればよろしいでしょうか? 「dd($lecture-<image);」に関してですが、「dd($lecture);」で試したところ、このようになりました。 https://gyazo.com/60de8b45853c0b4c69ddbd9e7dab5651 「#fillable: array:7」の中には確実に「image」と存在しているので、合っているのではないかという個人的な見解なのですが・・・。 ただ、やはり「#attributes: array:4」の中にはimageが渡ってきていないようですね。 ↓このように、画像を選択しているのですが・・・。 https://gyazo.com/feba7d497ee96e97067c7a8c43466cc9
satokei

2020/05/11 04:57

> foreachを通っているかの確認とは、どのようにすればよろしいでしょうか? foreach直下で「dd($image);」とすればよいかと
meshi_s

2020/05/11 05:28

satokeiさんの書かれている通りddとかで良いかと。ログ出力でもいいと思いますし。 > 「#fillable: array:7」の中には確実に「image」と存在しているので、合っているのではないかという個人的な見解なのですが・・・。 ddをあまり使わないでのあまり分からないのですが、fillableはモデルの情報ではないでしょうか。 恐らく、attributesに値が入っていくると思いますが、入っていないので画像情報が設定されていない気がします。
Keight

2020/05/11 05:29

https://gyazo.com/e0d015926af509691307b62530c616eb foreachでうまく取り出せていないようですね???? でもどうしてなんでしょう、以前はこの記述で取り出せていたのですが・・・。 どこがおかしいのか、現状で見当が付いていません。 考えられる部分はどこかありますでしょうか?
Keight

2020/05/11 05:33

// リクエストされた image データ(View側の name)を $images に代入 $images = $request->file('image'); // foreach で $images に入った画像を $image として別個に取り出す foreach ($images as $image) { // UNIXタイムスタンプを取得したものと、ユーザーID、オリジナルの拡張子を取得したものとを繋ぎ、ファイル名として $filename に代入 $filename = time() . '_' . $lecture->user_id . '.' . $image->getClientOriginalExtension(); // storeAs の第1引数は storage からのパス、第2引数はファイル名、第3引数は利用するストレージ(local、public…など) $path = $image->storeAs('', $filename, ['disk' => 'public']); // パスを image カラムに代入 $lecture->image = $path; // 最終的な状態を保存 $lecture->save(); } $request->file('image') を $images に保存し、その $images をforeachで $image として取り出せているとは思うのですが・・・(´ε`;)ウーン
satokei

2020/05/11 08:56

> foreach直下で「dd($image);」とすればよいかと foreachと書かれた行の、次の行への記載を意図したのですが、、、 $image変数が未定義なのであれば、foreachは通っていなさそうですが、 if文の条件は真と判定されているのでしょうか? 1行ずつどこまで通っているのか、確認してみてください。
Keight

2020/05/11 09:39 編集

>foreachと書かれた行の、次の行への記載を意図したのですが、、、 あ、これで大丈夫でしょうか? https://gyazo.com/c5b2f1b8f16bd9fb1f3d3c5f3d046e46 これで確認しても、やはり「Undefined variable: image」とエラーが出ますね・・・。 https://gyazo.com/1bcd1ae692d4619bce86102d3d9ce338 これで確認すると渡ってきているので、foreachで単数形の $image として取り出せるはずなんですが、なぜに未定義となるのか・・・いろいろ見てますが解決策が見出だせないですね???? if文については、画像を付けた場合は真と判定され、付けなかった場合には偽のほうで判定されていると思います。 画像を付けずに投稿した場合にelseの内容のみで渡って反映されているので。
satokei

2020/05/11 10:30

なるほどナゾですね....???? 「$images」変数の中身は配列なのですよね? 念のため結果を教えてください。
guest

回答1

0

自己解決

あれからforeachのところをじっくり考え直し、他のファイルにもくまなく目を配ってみたところ・・・解決しました!

lectures.create.blade.php

HTML

1<div class="form-group"> 2 <label class="font-weight-bold">画像</label> 3 <input type="file" id="file1" name="image[]" class="form-control-file" multiple="multiple"> 4</div>

foreachを使っているということは、配列ということなので、name="image"のところ、imageの末尾に[]が無いといけないのに、付いていなかったことが原因でした。
お騒がせしました。
回答いただいた方、どうもありがとうございましたm(_ _)m

投稿2020/05/11 15:00

Keight

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問