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']); }