Laravel中如何正确保存带自定义URL的多图数组数据
错误原因
你的代码有两个核心问题导致结果不符合预期:
- 对
json_encode()返回的JSON格式字符串执行foreach遍历是无效操作,JSON字符串是文本内容不是可遍历的数组,直接遍历会把整段JSON文本当做单个值拼接到URL路径中 - 遍历生成URL时没有做数组追加操作,每次循环都会直接覆盖
$input['slider_image_url']的值,即使遍历逻辑正确最终也只能拿到最后一张图的URL
修正后代码
直接在处理上传文件的循环中同步生成文件名和对应URL,不需要二次遍历,逻辑更简洁也不会出错:
if ($request->hasFile('slider_image')) { // 提前初始化空数组,避免未定义变量报错 $fileNameList = []; $imageUrlList = []; foreach($request->file('slider_image') as $slider_image) { $filenameWithExt = $slider_image->getClientOriginalName(); $filename = pathinfo($filenameWithExt, PATHINFO_FILENAME); $extension = $slider_image->getClientOriginalExtension(); // 拼接唯一文件名,避免同秒上传多图时文件名重复覆盖 $fileNameToStore = $filename. '_'. time(). '_'. uniqid().'.'.$extension; $slider_image->storeAs('public/artists/products/slider_image', $fileNameToStore); // 文件名存入文件名数组 $fileNameList[] = $fileNameToStore; // 同步拼接访问URL存入URL数组 $imageUrlList[] = url('storage/artists/products/slider_image/'.$fileNameToStore); } // 如果数据库对应字段是JSON类型存储,对数组做编码后赋值即可 $input['slider_image'] = json_encode($fileNameList); $input['slider_image_url'] = json_encode($imageUrlList); }
补充说明
- 如果你对应的数据库字段不需要存储JSON格式,直接把
json_encode()去掉,将原生数组赋值给对应字段即可,适配你自己的字段存储规则 - 原代码仅用
time()作为文件名后缀,同一次请求上传多图时,因为PHP处理速度极快,多张图很可能拿到相同的时间戳,导致同名文件被覆盖,新增uniqid()拼接可以保证文件名全局唯一
内容的提问来源于stack exchange,提问作者vignesh
相关产品推荐
相关产品推荐

