kekekiw123's avatar

Fatal error: Call to a member function guessExtension() on array - Multiple image upload

I am trying to upload multiple images over my laravel rest api.

I am injecting a form validation to my controller that has the rule: 'images' => 'required|array|min:1|max:5'

If it passes it will go into the controller where I have this:

 $files = $request->file('images');

     foreach ($files as $file) {
         // Validate each file
         $rules = ['images' => 'image|mimes:jpg,jpeg,bmp,png,gif|max:9000'];
         $validator = Validator::make(['file'=> $file], $rules);

         if ($validator->fails()) {
           return response()->json(['errors' => $validator->messages()->all()],400);
         }

         $newUser->uploadThumbAndMainImage($request,$userId);
     }

And finally the model function

public function uploadThumbAndMainImage($request,$userId)
    {
      // get basic info
        $s3 = Storage::disk('s3');
        $file = $request->file('images');
        $extension = $request->file('images')->guessExtension();
        $filename = uniqid() . '.' . $extension;
        $mimeType = $request->file('images')->getClientMimeType();
        $fileSize = $request->file('images')->getClientSize();
        $image = Image::make($file);

        // generate the thumb and medium image
        $imageThumb = Image::make($file)->fit(320)->crop(320, 240, 0, 0);
        $imageThumb->encode($extension);

        $imageMedium = Image::make($file)->resize(800, null, function ($constraint) {
            $constraint->aspectRatio();
        });
        $imageMedium->encode($extension);

        $image->encode($extension);

        // upload image to S3
        $s3->put("images/{$userId}/main/" . $filename, (string) $image, 'public');
        $s3->put("images/{$userId}/medium/" . $filename, (string) $imageMedium, 'public');
        $s3->put("images/{$userId}/thumb/" . $filename, (string) $imageThumb, 'public');
    }

But I get the error: Fatal error: Call to a member function guessExtension() on array

And yeah I post my images as "images[]" since I am allowing to upload multiple files at once.

0 likes
4 replies
ohffs's avatar
ohffs
Best Answer
Level 50

Shouldn't this be passing the $file instead of $request :

$newUser->uploadThumbAndMainImage($request,$userId);
kekekiw123's avatar

@ohffs thank you! I completely forgot what I was looping through...

This did it:

public function uploadThumbAndMainImage($file,$userId)
    {
      // get basic info
        $s3 = Storage::disk('s3');

        $extension = $file->guessExtension();
        $filename = uniqid() . '.' . $extension;
        $mimeType = $file->getClientMimeType();
        $fileSize = $file->getClientSize();
        $image = Image::make($file);

        // generate the thumb and medium image
        $imageThumb = Image::make($file)->fit(320)->crop(320, 240, 0, 0);
        $imageThumb->encode($extension);

        $imageMedium = Image::make($file)->resize(800, null, function ($constraint) {
            $constraint->aspectRatio();
        });
        $imageMedium->encode($extension);

        $image->encode($extension);

        // upload image to S3
        $s3->put("images/{$userId}/main/" . $filename, (string) $image, 'public');
        $s3->put("images/{$userId}/medium/" . $filename, (string) $imageMedium, 'public');
        $s3->put("images/{$userId}/thumb/" . $filename, (string) $imageThumb, 'public');
    }
ohffs's avatar

That's my good deed for Friday done - now I can go to the pub as a reward! ;-)

1 like
javedgardezi's avatar

Hi @kiwo123 , I am also trying to upload images using rest API. Cannot figure out the best way to upload image.

Can you please advise the way to upload images using restAPI. Including client that is sending request to Laravel API. I am also testing it using Postman but cannot get images to work.

Please or to participate in this conversation.