Laravel编辑页上传图片画廊时getClientOriginalName()报错求助
解决Laravel上传图片时getClientOriginalName()错误的问题
哈,这个错误我太熟了!你遇到的getClientOriginalName()报错,本质原因是你尝试在不是Laravel封装的UploadedFile对象上调用这个方法——简单说就是你拿到的$img根本不是正确的文件实例,自然没法调用文件相关的方法。
结合你给出的代码片段,我帮你拆解下问题和解决方案:
一、先排查最基础的表单问题
上传文件的表单必须加上enctype="multipart/form-data"属性,否则Laravel根本接收不到文件对象,只会拿到一堆乱码或者临时路径。比如你的Blade表单应该写成:
<form method="POST" action="{{ route('accommodation.update', $id) }}" enctype="multipart/form-data"> @csrf @method('PUT') <!-- 其他表单字段 --> <input type="file" name="img[]" multiple> <!-- 多文件上传要加[] --> <button type="submit">更新</button> </form>
二、修正控制器里的文件获取逻辑
你代码里的foreach ($request['img'] as $img)是错的!直接取$request['img']拿到的不是文件对象,要改用$request->file('img')来获取上传的文件数组。另外还有几个小坑要注意:
完善后的控制器代码示例
public function update(Request $request, $id) { // 用findOrFail更安全,找不到数据直接抛404 $findObject = Accommodation::findOrFail($id); // 更新时排除图片字段,单独处理 $findObject->update($request->except('img')); // 删除旧的画廊数据(你之前的destroy用法不对,destroy需要主键ID,这里用where+delete更合适) Gallery::where('objects_id', $id)->delete(); // 先判断是否有文件上传,避免空循环报错 if ($request->hasFile('img')) { foreach ($request->file('img') as $img) { // 先验证文件是否有效 if ($img->isValid()) { // 获取原始文件名,或者用hashName()生成唯一文件名(推荐后者,避免重名覆盖) $fileName = $img->hashName(); // 存储到指定文件夹,比如public目录下的galleries文件夹 // 第三个参数'public'对应filesystems.php里的磁盘配置 $filePath = $img->storeAs('galleries', $fileName, 'public'); // 保存画廊记录,这里存的是文件路径,不是文件对象 $gallery = new Gallery(); $gallery->objects_id = $id; $gallery->img = $filePath; $gallery->save(); } } } return redirect()->back()->with('success', '内容更新成功!'); }
三、额外的优化建议
- 添加文件验证:在处理之前先验证文件类型和大小,避免非法文件上传:
$request->validate([ 'img.*' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048', // 每个图片不超过2M ]); - 处理头部图片:如果还有单独的头部图片上传,逻辑类似,比如
$request->file('header_img'),单独处理即可。 - 旧文件清理:如果需要删除旧的图片文件,可以在删除Gallery记录时,用
Storage::delete($gallery->img)来删除对应的文件(记得引入Illuminate\Support\Facades\Storage)。
内容的提问来源于stack exchange,提问作者user8768177
相关产品推荐
相关产品推荐

