【问题标题】:Laravel Image Uploading IssueLaravel 图片上传问题
【发布时间】:2020-07-08 21:49:48
【问题描述】:

您好,我正在尝试在我的 laravel 应用中上传用户照片,

当用户更新他/她的个人资料时,用户可以添加一个属性。

问题

现在当我运行我当前的代码时,如果用户尝试更新个人资料而不上传照片,它会给我一个错误提示

"在 null 上调用成员函数 extension()"

但是当我尝试上传照片时,照片上传成功图片名称未存储在数据库中(保存的是空值而不是图片名称)和其他字段不会得到更新。

这是我的用户配置文件更新控制器代码(仅包含功能)

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

        }

下面是我的表格,

<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>

【问题讨论】:

    标签: php mysql laravel file-upload laravel-6


    【解决方案1】:

    尝试替换

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

    对这些

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

    【讨论】:

    • 不,错误,在 null 上调用成员函数 getClientOriginalExtension()
    • @VolkaDimitrev 你能删除这行&lt;!-- &lt;form action="{{ route('settings.update',$user-&gt;id) }}" method="POST"&gt; --&gt; 并在它有效的情况下再试一次吗?或者尝试将dd(request()-&gt;all()) 放在update 函数内的第一个位置,然后给我它打印的内容。
    • 两者都做了,但仍然报同样的错误,在 null 上调用成员函数 getClientOriginalExtension()
    • 显示存储功能您如何存储图像,这很重要,然后我可以帮助您
    【解决方案2】:

    所以我终于找到了解决上述问题的方法, 我按照下面的说明更改了我的控制器功能,并且没有更改表单,

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

    所以这对我有用。

    【讨论】:

      猜你喜欢
      • 2017-03-13
      • 2020-11-16
      • 2015-08-13
      • 1970-01-01
      • 2021-07-19
      • 2019-04-24
      • 1970-01-01
      • 2017-09-20
      相关资源
      最近更新 更多