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);としてみると、画像が渡ってきているみたいです。

これは一体どういうことなんでしょうか?
確認させてください。
- 画像はディレクトリに保存されていますか?
- エラーは発生していないのでしょうか?(ログやtry-catchなどで確認)
ご回答ありがとうございます。
・画像のディレクトリというのは、storage/app/publicのことでしょうか?
画像を添付して投稿後、確認してみましたがその中には入っていないようです。
過去、画像を付けての投稿が問題なくできましたので、その際に投稿した画像が入っているのを確認できるだけですね。
https://gyazo.com/0b7f259d2de47948a9432d8c974a3abe
コントローラー側、ビュー側でも、そのときの記述内容と何ら変えていないと思うのですが、なぜかこのような状況に陥っております????
・画像を付けての投稿の際もエラー画面は特に出ませんが、トップページにリダイレクトされ、その投稿は反映されません。
一方で、画像を付けずにタイトルや本文だけを入力し投稿すると、きちんとその内容が反映されています。
foreachを通っている確認はされましたか?
また、「dd($lecture-<image);」はあってますか?
ありがとうございます。
foreachを通っているかの確認とは、どのようにすればよろしいでしょうか?
「dd($lecture-<image);」に関してですが、「dd($lecture);」で試したところ、このようになりました。
https://gyazo.com/60de8b45853c0b4c69ddbd9e7dab5651
「#fillable: array:7」の中には確実に「image」と存在しているので、合っているのではないかという個人的な見解なのですが・・・。
ただ、やはり「#attributes: array:4」の中にはimageが渡ってきていないようですね。
↓このように、画像を選択しているのですが・・・。
https://gyazo.com/feba7d497ee96e97067c7a8c43466cc9
> foreachを通っているかの確認とは、どのようにすればよろしいでしょうか?
foreach直下で「dd($image);」とすればよいかと
satokeiさんの書かれている通りddとかで良いかと。ログ出力でもいいと思いますし。
> 「#fillable: array:7」の中には確実に「image」と存在しているので、合っているのではないかという個人的な見解なのですが・・・。
ddをあまり使わないでのあまり分からないのですが、fillableはモデルの情報ではないでしょうか。
恐らく、attributesに値が入っていくると思いますが、入っていないので画像情報が設定されていない気がします。
https://gyazo.com/e0d015926af509691307b62530c616eb
foreachでうまく取り出せていないようですね????
でもどうしてなんでしょう、以前はこの記述で取り出せていたのですが・・・。
どこがおかしいのか、現状で見当が付いていません。
考えられる部分はどこかありますでしょうか?
// リクエストされた 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 として取り出せているとは思うのですが・・・(´ε`;)ウーン
> foreach直下で「dd($image);」とすればよいかと
foreachと書かれた行の、次の行への記載を意図したのですが、、、
$image変数が未定義なのであれば、foreachは通っていなさそうですが、
if文の条件は真と判定されているのでしょうか?
1行ずつどこまで通っているのか、確認してみてください。
>foreachと書かれた行の、次の行への記載を意図したのですが、、、
あ、これで大丈夫でしょうか?
https://gyazo.com/c5b2f1b8f16bd9fb1f3d3c5f3d046e46
これで確認しても、やはり「Undefined variable: image」とエラーが出ますね・・・。
https://gyazo.com/1bcd1ae692d4619bce86102d3d9ce338
これで確認すると渡ってきているので、foreachで単数形の $image として取り出せるはずなんですが、なぜに未定義となるのか・・・いろいろ見てますが解決策が見出だせないですね????
if文については、画像を付けた場合は真と判定され、付けなかった場合には偽のほうで判定されていると思います。
画像を付けずに投稿した場合にelseの内容のみで渡って反映されているので。
なるほどナゾですね....????
「$images」変数の中身は配列なのですよね?
念のため結果を教えてください。
回答1件
あなたの回答
tips
プレビュー