Laravel+Craftable文件上传报错:Call to a member function file() on null
解决「Call to a member function file() on null」文件上传错误
这个错误说明$request->file('foto_ampliacion')返回了null,即请求中没有正确接收到上传的文件。以下是针对性的排查和解决步骤:
1. 验证请求规则配置
检查StoreVado请求类的验证规则,确保允许foto_ampliacion字段作为文件上传:
// app/Http/Requests/Admin/Vado/StoreVado.php public function rules() { return [ // 其他字段规则 'foto_ampliacion' => 'nullable|file|image|max:2048', // 根据需求调整,nullable表示可选上传 ]; }
如果规则中遗漏了file类型验证,或字段名拼写错误,会导致请求过滤掉该字段,最终返回null。
2. 确保Vue提交逻辑正确处理文件
由于表单使用了@submit.prevent="onSubmit"手动拦截提交,必须通过FormData对象传递文件,不能直接发送JSON:
// 组件中的onSubmit方法 methods: { onSubmit() { this.submiting = true; const formData = new FormData(this.$el); axios.post(this.action, formData, { headers: { 'Content-Type': 'multipart/form-data' } }) .then(res => { // 处理成功回调 }) .catch(err => { // 处理错误 }) .finally(() => { this.submiting = false; }); } }
普通JSON请求无法携带文件,必须用FormData并设置对应请求头。
3. 添加文件存在性的防御检查
修改控制器代码,先判断文件是否存在再执行后续操作,避免空指针错误:
public function store(StoreVado $request) { $sanitized = $request->getSanitized(); // 先检查文件是否存在 if ($request->hasFile('foto_ampliacion')) { $file = $request->file('foto_ampliacion'); $fileName = $file->getClientOriginalName(); $path = $file->storeAs('images', $fileName, 'public'); $sanitized["foto_ampliacion"] = '/storage/' . $path; } $vado = Vado::create($sanitized); if ($request->ajax()) { return ['redirect' => url('admin/vados'), 'message' => trans('brackets/admin-ui::admin.operation.succeeded')]; } return redirect('admin/vados'); }
4. 检查Sanitize逻辑是否保留字段
确认StoreVado请求类的sanitize方法没有过滤掉foto_ampliacion字段:
// app/Http/Requests/Admin/Vado/StoreVado.php public function sanitize() { return $this->merge([ // 其他字段处理 'foto_ampliacion' => $this->input('foto_ampliacion'), // 确保字段被保留 ]); }
如果sanitize方法未包含该字段,会导致$sanitized数组中丢失对应值。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

