You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模型中添加:
    protected $casts = [
        'project_photo_url' => 'array',
    ];
    
    这样Laravel会自动处理数据库中JSON字符串与PHP数组的相互转换,无需手动调用json_encode/json_decode
  • 确保Storage facade已正确引入(顶部需有use Illuminate\Support\Facades\Storage;)

内容的提问来源于stack exchange,提问作者Martinus Goh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:45:52