Laravel CRUD更新已上传图片时getClientOriginalExtension报错如何解决
Laravel CRUD更新上传图片报错排查方案
报错根因梳理
- 第一个报错
Call to a member function getClientOriginalExtension() on string
最初代码直接通过
$request->warrantyUpload获取参数,拿到的是字符串类型的文件名,不是Laravel封装的UploadedFile文件对象,无法调用对象方法。
- 第二个报错
Call to a member function getClientOriginalExtension() on null
改用
$request->file()获取文件对象后,后端未接收到上传的文件,返回空值,调用方法时报错。
排查与修复步骤
- 修正前端表单错误
- 按钮type属性拼写错误:把
subumit改为正确的submit - 移除file输入框的value属性:
<input type="file">不支持预设value,填写的原有文件名属于无效配置,可能干扰表单提交
- 按钮type属性拼写错误:把
- 检查文件上传配置
- 验证PHP配置项
upload_max_filesize和post_max_size,如果上传文件大小超过配置上限,文件字段会被自动丢弃 - 确认前端渲染后的表单源码中确实存在
enctype="multipart/form-data"属性,没有被其他前端逻辑覆盖
- 验证PHP配置项
- 完善后端代码逻辑
首先补充文件存在性判断,兼容用户不更新图片仅修改其他字段的场景,同时修正字段拼写错误(原有代码中将warrantyUpload错写为warrantyUplaod,l和a顺序颠倒),参考代码如下:
// 仅当用户上传了新图片时执行图片处理逻辑 if ($request->hasFile('warrantyUpload')) { $image = $request->file('warrantyUpload'); $destinationPath = public_path('/uploads/'); $ext = $image->getClientOriginalExtension(); $fileName = "img_" . rand(111111, 999999) . "." . $ext; $image->move($destinationPath, $fileName); $data->warrantyUpload = $fileName; } // 没有新上传图片则保留原有图片地址,直接保存其他字段 $data->save();
内容的提问来源于stack exchange,提问作者Tayyab
相关产品推荐
相关产品推荐

