Laravel中Storage::Delete处理JSON数组报错及旧图删除失败问题
问题分析与解决方案
错误原因
出现json_decode(): Argument #1 ($json) must be of type string, array given是因为你的Laravel模型中,大概率已经将project_photo_url字段通过$casts属性转换为数组类型了。此时$project->project_photo_url直接返回数组,再用json_decode处理数组自然会报错。
而旧图片无法删除,正是因为错误的解码逻辑导致你没有正确获取到旧图片的文件名数组,进而无法执行删除操作。
修正后的代码
$projectphotos = []; $photocount = 1; if ($request->hasFile('project_photo_url')) { // 处理上传的新图片 foreach ($request->file('project_photo_url') as $file) { $currentDateTime = now()->format('YmdHis'); $filename = $initials . "_" . $photocount . '_' . $currentDateTime . '.' . $file->getClientOriginalExtension(); $file->storeAs('public/project/photos', $filename); $photocount++; $projectphotos[] = $filename; } // 获取旧图片数组(模型已自动转换为数组,无需json_decode) $oldPhotos = $project->project_photo_url; // 删除旧图片 if (!empty($oldPhotos)) { foreach ($oldPhotos as $photo) { Storage::delete('public/project/photos/' . $photo); } } // 更新为新图片数组(模型会自动转为JSON存入数据库) $project->project_photo_url = $projectphotos; } $project->save();
关键调整说明
- 移除
json_decode($project->project_photo_url),直接使用$project->project_photo_url获取旧图片数组(前提是模型中已配置$casts) - 如果你的模型还没配置字段转换,需要在
Project模型中添加:
这样Laravel会自动处理数据库中JSON字符串与PHP数组的相互转换,无需手动调用protected $casts = [ 'project_photo_url' => 'array', ];json_encode/json_decode - 确保
Storagefacade已正确引入(顶部需有use Illuminate\Support\Facades\Storage;)
内容的提问来源于stack exchange,提问作者Martinus Goh
相关产品推荐
相关产品推荐

