Laravel Image Uploading Issue

Volka Dimitrev :

Hello I'm trying to upload user photo in my laravel app,

When the user updating his/her profile user can add a propic.

The Problem

Now when I run my current code, If the user trying to update profile without uploading a photo, it gives me error saying

"Call to a member function extension() on null"

But when I try to upload a photo, photo get uploaded successfully but the image name not storing in the DB (null value saved instead of image name) and other fields won't GET UPDATED.

Here is my user profile update controller code (Only the function is included)

public function update(Request $request, User $setting)
        {

            $changedAttributes = array_diff($request->all(), $setting->getAttributes());

            $validationRules = array_intersect_key([
               'name'      => ['required', 'alpha','min:2', 'max:255'],
               'last_name' => ['required', 'alpha','min:5', 'max:255'],
               'mobile'    => ['required', 'string', 'regex:/\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
               2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
               4[987654310]|3[9643210]|2[70]|7|1)\d{1,14}$/'],
               'email'     => ['required', 'string', 'email', 'max:255', 'unique:users,email,'.$setting->id.''],
               'propic' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
           ], $changedAttributes);

           $imageName = time().'.'.$request->propic->extension();  

           $request->propic->move(public_path('propics'), $imageName);

           $this->validate($request, $validationRules);

           $setting->update($changedAttributes);

           return Redirect::back()->with('success',__('sentence.User updated successfully'));  

        }

And following is my form,

<form action="{{ route('settings.update',$user->id) }}" method="POST" enctype="multipart/form-data" >
            <div class="row mt-5">
            <div class="col-sm-3">
            <img src="/img/blank_user.png" alt="Profile Pic" style="border-radius: 100px;height: 150px;width: 150px; opacity: 0.5;" id="profile_pic_display">
            <input type="file" name="propic" class="form-control">  
            </div>
            <div class="col-sm-9">
            <!-- <form action="{{ route('settings.update',$user->id) }}" method="POST"> -->
            @csrf
        @method('PUT')
        <div class="row">
        <div class="col-md-6">

                                <div class="form-group field-user-firstname required">
                                    <label class="control-label" for="user-firstname">{{ __('sentence.First Name') }}</label>
                                    <input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{$user->name}}" required autocomplete="name" autofocus>

                                @error('name')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror

                                </div>
                            </div>
                            <div class="col-md-6">
                                <div class="form-group field-user-lastname required">
                                    <label class="control-label" for="user-lastname">{{ __('sentence.Last Name') }}</label>
                                    <input id="last_name" type="text" class="form-control @error('name') is-invalid @enderror" name="last_name" value="{{$user->last_name}}" required autocomplete="last_name" autofocus>

                                @error('name')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                                </div>                    
                            </div>
        </div>
        <div class="row">
                            <div class="col-md-6">
                                <div class="form-group field-user-mobile required">
                                    <label class="control-label" for="user-mobile">{{ __('sentence.Mobile') }}</label>
                                    <input id="mobile" type="text" class="form-control @error('mobile') is-invalid @enderror" name="mobile" value="{{$user->mobile}}" required autocomplete="mobile" autofocus>

                                @error('mobile')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                                </div>
                            </div>

                            <div class="col-md-6">
                                <div class="form-group field-user-email required">
                                    <label class="control-label" for="user-email">{{ __('sentence.Email') }}</label>
                                    <input id="email_" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{$user->email}}" required autocomplete="email">

                                @error('email')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                                </div>
                            </div>

        </div>
        <div class="row">
                    <div class="pull-right form-group">
                    <button type="submit" class="btn btn-default">{{ __('sentence.Cancel') }}</button>     
                    <button type="submit" class="btn btn-primary">{{ __('sentence.Update') }}</button>       
                    </div>
        </div>
                        </div>

            </form>
Volka Dimitrev :

So finally I able to found a solution for my above stated problem, I changed my controller function as stated in the below and made no change in the form,

public function update(Request $request, User $setting)
        {

            $changedAttributes = array_diff($request->all(), $setting->getAttributes());

            $validationRules = array_intersect_key([
               'name'      => ['required', 'alpha','min:2', 'max:255'],
               'last_name' => ['required', 'alpha','min:5', 'max:255'],
               'mobile'    => ['required', 'string','min:10','max:14', 'regex:/\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
               2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
               4[987654310]|3[9643210]|2[70]|7|1)\d{1,14}$/'],
               'email'     => ['required', 'string', 'email', 'max:255', 'unique:users,email,'.$setting->id.''],
               'propic' => ['required','image','mimes:jpeg,png,jpg,gif,svg','max:2048'],
           ], $changedAttributes);

           if($request->hasFile('propic'))
           {
                $this->validate($request, [
                    'name' => ['required', 'alpha','min:2', 'max:255'],
                    'last_name' => ['required', 'alpha','min:5', 'max:255'],
                    'mobile' => ['required', 'string','min:10','max:14', 'regex:/\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
                    2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
                    4[987654310]|3[9643210]|2[70]|7|1)\d{1,14}$/'],
                    'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email,'.$setting->id.''],
                    'propic' => ['required','image','mimes:jpeg,png,jpg,gif,svg','max:2048'],
                ],$request->all());

                $imageName = time().'.'.$request->propic->extension();  
                $request->propic->move(public_path('propics'), $imageName);
                $setting->propic=$imageName;
                $setting->name=$request->input('name');
                $setting->last_name=$request->input('last_name');
                $setting->mobile=$request->input('mobile');
                $setting->email=$request->input('email');
                $setting->update();
                return Redirect::back()->with('success',__('User updated successfully'));  
           }

           $this->validate($request, $validationRules);

           $setting->update($changedAttributes);

           return Redirect::back()->with('success',__('User updated successfully'));  

        }

So this has worked for me.

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=379425&siteId=1