kendrick's avatar

Upload Validation Issue (Error Communication)

I implemented a new validation to my Users Avatar upload, but it won't validate the files correctly, just uploads everything.

ProfileController.php

public function uploadAvatar(Request $request){

        if($request->hasFile('avatar')){
                $user = Auth::user();

                $image = $request->file('avatar');

                $validator = Validator::make(
                    $image, [
                        'avatar' => 'required|mimes:jpg,jpeg,png,bmp|max:800'
                    ],[
                        'avatar.required' => 'Please upload an image',
                        'avatar.mimes' => 'Only jpeg,png and bmp images are allowed',
                        'avatar.max' => 'Sorry! Maximum allowed size for an image is 20MB',
                    ]);

                    if ($validator->fails()) {
                        return response()->json(array(
                         'success' => false,
                         'errors' => $validator->errors()->toArray()), 400);   
                    }

                    
                $filename = time() . '.' . $image->getClientOriginalExtension();
                $location = public_path('uploads/avatars/'. $filename);
                Image::make($image)->resize(300,300)->save($location);

                $user->avatar = $filename;
                $user->save();  
            }

            return redirect()
                ->route('profile.editavatar')
                ->with('info', 'Your avatar has been uploaded.');
        }

Am I doing something wrong in terms of order?

0 likes
3 replies
adnan483's avatar

You can try making new request

php artisan make:request UploadRequest

Here is Upload Request file:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UploadRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
            'avatar.*' => 'required|mimes:jpg,jpeg,png,bmp|max:800',
            'avatar.*.required' => 'Please upload an image',
            'avatar.*.mimes' => 'Only jpeg,png and bmp images are allowed',
            'avatar.*.max' => 'Sorry! Maximum allowed size for an image is 20MB'
        ];
    }
}

and then:

public function uploadAvatar(UploadRequest $request){

        if($request->hasFile('avatar')){
            $user = Auth::user();
            $input_data = $request->all();
            $image = $request->file('avatar');
            $filename = time() . '.' . $image->getClientOriginalExtension();
            $location = public_path('uploads/avatars/'. $filename);
            Image::make($image)->resize(300,300)->save($location);
            $user->avatar = $filename;
            $user->save();  
        }

        return redirect()
            ->route('profile.editavatar')
            ->with('info', 'Your avatar has been uploaded.');
    }

don't forget to import Request on top of controller:

use App\Http\Requests\UploadRequest;
1 like
kendrick's avatar

Thank you @adnan483

This makes sense, I tried it with a very large sized picture (size:2044854) but it won't stop it from being uploaded

kendrick's avatar

Updated my Version above, now it results in

Type error: Argument 1 passed to Illuminate\Validation\Factory::make() must be of the type array, object given

Please or to participate in this conversation.