Laravel 画像の複数アップロード

inputタグに追記

multiple属性、name属性をfiles[image]とする。 files[image]としてファイルを選択して送信すると、Requestとして配列で渡ってくるので配列のバリデーションが必要。 →フォームリクエストに追記する。

<div class="p-2 w-1/2 mx-auto">
<div class="relative">
<label for="image" class="leading-7 text-sm text-gray-600">画像</label>
{{-- 画像の場合file,name属性でコントローラのほうでimageとすれば画像を取得できる --}}
<input type="file" id="image" name="files[][image]" multiple accept=“image/png,image/jpeg,image/jpg” class="w-full ~~">
</div>
</div>
バリデーション追記

readouble.com 配列内の属性をバリデーションするには、「ドット記法」が使える。
リクエストにfiles[][image]が渡るので、以下のように書ける。
files[].*.image
→フォームリクエストに記述。

<?php
public function rules()
{
    $rules = [
        'image' => ['image','mimes:jpg,jpeg,png','max:2048'],
        'files.*.image' => ['image','mimes:jpg,jpeg,png','max:2048'],
    ];
    if($this->route === 'owner.images.store'){
        $rules = array_merge($rules,[
            'files' => 'required',
        ],);
    }
    return $rules;
}

public function messages() {
    return [
    'image' => '指定されたファイルが画像ではありません。',
    'mines' => '指定された拡張子(jpg/jpeg/png)ではありません。',
    'max' => 'ファイルサイズは2MB以内にしてください。',
    ];
    }
Controller

画像を複数アップロードする場合、取得する方法が変わってくる。
fileメソッドの引数としてname属性であるfilesをいれることで複数の画像を配列形式で取得できる。

<?php
public function store(UploadImageRequest $request)
{
    //create.blade側のinputのname属性filesを引数とすることで、複数の画像を配列形式で取得
    $imageFiles = $request->file('files');
    if(!is_null($imageFiles)){
        //foreachで1つずつImageServiceでファイル名作る→拡張子取得→interventionImageでリサイズ
        //出来上がったファイル名を$fileNameToStoreとして取得し、createで保存
        foreach($imageFiles as $imageFile){
            $fileNameToStore = ImageService::addByImage($imageFile, 'products');
             Image::create([
                'owner_id' => Auth::id(),
                'filename' => $fileNameToStore
             ]);
        }
    }
    return redirect()->route('owner.images.index')->with(['message' => '画像登録を実施しました。','status'=>'info']);
}