Laravelで知恵袋的なWebサービスを開発中です。
投稿フォームのビュー(create.blade.php)で、
<input type="file" name="image[]">
と、画像が複数送信された際に対応できるよう、nameの中のimageの末尾に[]を付けていますが、これは正しい考えでしょうか?
LecturesController ではこのように書いています。
public function store(Request $request) {
$this->validate($request, [ 'category_name' => 'required', 'title' => 'required|max:100', 'content' => 'required', ]); if($request->file('image')) { $lecture = new Lecture; $lecture->user_id = \Auth::id(); $lecture->category_name = $request->category_name; $lecture->title = $request->title; $lecture->content = $request->content; // リクエストされた image データ(View側の name)を $images に代入 $images = $request->file('image'); // foreach で $images に入った画像を $image として別個に取り出す foreach ($images as $image) { // UNIXタイムスタンプを取得したものと、ユーザーID、オリジナルの拡張子を取得したものとを繋ぎ、ファイル名として $filename に代入 $filename = time() . '_' . $lecture->user_id . '.' . $images->getClientOriginalExtension(); // storeAs の第1引数は storage からのパス、第2引数はファイル名、第3引数は利用するストレージ(local、public…など) $path = $image->storeAs('', $filename, ['disk' => 'public']); // パスを image カラムに代入 $lecture->image = $path; // 最終的な状態を保存 $lecture->save(); } } else { $request->user()->lectures()->create([ 'category_name' => $request->category_name, 'title' => $request->title, 'content' => $request->content, ]); } return redirect('/'); }
また、画像を表示させたいビューの当該部分はこちらです。
show.blade.php
@if ($lecture)
@if ($lecture->image)
<figure class="show_post_thumbnail"><div class="new_area-img text-center"><img class="show_image" src="{{ asset('storage/'.$lecture->image) }}"></div></figure>
@else
<figure class="show_post_thumbnail"><div class="new_area-img text-center"><img src="../img/noimage.gif"></div></figure>
@endif
以上の内容で画像を付けて投稿すると、このようなエラーが出てきます。
Call to a member function getClientOriginalExtension() on array
ちなみに、imageの末尾に[]を付けず、コントローラーの中でforeach文も取り除くと、画像を投稿してもエラーは出ません。
もちろん、画像は1枚しか出てこないですが。
どなたか詳しい方いらっしゃいましたら、アドバイスいただけると幸いですm(_ _)m