Laravel 7上传图片时$request->file('profile_image')返回null求助
问题根因与解决方案
你遇到的问题由多个错误叠加导致,按优先级修正如下:
1. 核心错误:字段名不匹配
前端表单文件输入框的name属性为profil_image,后端接收时使用的字段名是profile_image(多了一个字母e),完全对应不上,所以$request->file()永远返回null。
修正方案:修改前端edit.blade.php的文件输入框代码:
<div class="input-group mb-3"> <input type="file" name="profile_image" id="profile_image" class="form-control"> </div>
2. 调试逻辑顺序错误
控制器中你先执行了dd($request->all()),该方法会直接终止脚本运行,后面的dd($request->file('profile_image'))永远不会执行。如果需要调试文件参数,需要把两个dd的顺序调换,或者注释掉不需要的调试代码。
3. 文件移动方法使用错误
Laravel的UploadedFile::move()方法第一个参数是目标存储目录,第二个参数是保存的文件名,你把两个参数写反了,同时不需要额外调用$file->save(),move方法执行完成后文件就已经移动完成。
另外你没有把头像的文件名写入用户表,后续无法读取用户头像。
修正方案:替换控制器中的文件处理逻辑:
public function update(Request $request) { $time_date = \Carbon\Carbon::now()->toDateTimeString(); $user = Auth::user(); if($user->role_id =='1'){ $id = $request->input('id'); $data_user = User::findOrFail($id); // 避免无效id报错 if($request->hasFile('profile_image')){ $file = $request->file('profile_image'); $extension = $file->getClientOriginalExtension(); $filename = $request->id.'.'.$extension; // 第一个参数为目标目录,第二个为保存的文件名 $file->move(public_path('user'), $filename); // 把头像文件名存入用户表对应字段,根据你的实际字段名调整 $data_user->profile_image = $filename; } $data_user->nama_lengkap = $request->input('name'); $data_user->email = $request->input('email'); // 密码仅在用户提交时更新,且加密存储 if($request->filled('password')){ $data_user->password = \Hash::make($request->input('password')); } $data_user->gender = $request->input('gender'); $data_user->last_modified_by = Auth::user()->nama_lengkap; $data_user->last_modified_time = $time_date; $data_user->save(); return redirect('/indexadmin')->with('Berhasil Edit','Berhasil Edit'); } elseif($user->role_id =='2'){ return redirect('/indexuser'); } }
4. 目录权限检查
确认public/user目录存在,且有读写权限,Linux环境下可执行命令设置权限:
chmod -R 755 public/user
可选:存储到storage/public目录
如果需要把文件存储到storage/public目录下,替换文件处理逻辑即可:
if($request->hasFile('profile_image')){ // 文件会自动保存到storage/app/public/user目录,自动生成唯一文件名 $path = $request->file('profile_image')->store('user', 'public'); $data_user->profile_image = $path; }
执行命令创建软链到public目录,即可通过域名直接访问:
php artisan storage:link
访问路径为asset('storage/'.$user->profile_image)。
其他待修正问题
- 性别下拉框两个option的value都写死为用户原有性别,无论选哪个都不会修改,修正为:
<select class="form-control" name="gender"> <option value="Laki-Laki" {{ $data_user->gender == 'Laki-Laki' ? 'selected' : '' }}>Laki-Laki</option> <option value="Perempuan" {{ $data_user->gender == 'Perempuan' ? 'selected' : '' }}>Perempuan</option> </select>
- 原代码直接存储明文密码,属于严重安全漏洞,上面修正后的代码已经做了哈希加密处理。
内容的提问来源于stack exchange,提问作者renaldyks
相关产品推荐
相关产品推荐

