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

Laravel中文件存在但Spatie Media Library提示不存在问题排查

问题原因

你误用了addMediaFromDisk方法的参数:

  • 该方法第一个参数是目标磁盘内的相对路径,而非文件绝对路径;
  • 第二个参数是磁盘名称(比如local/public),你却传入绝对路径还指定public磁盘,导致Spatie去public磁盘根目录查找该绝对路径文件,自然找不到。

另外你的路径拼接逻辑存在混乱:

  • storage_path('temporaryFiles/'.$file['path'])生成的是storage/temporaryFiles/temporaryFiles/xxx.pdf(因为$file['path']已包含temporaryFiles/前缀);
  • 错误信息显示Spatie实际在查找storage/app/temporaryFiles/xxx.pdf,两者路径不匹配,但你用错误路径做file_exists判断自然返回true,误导了自己。
解决方案

根据你的上传逻辑,临时文件存在默认的local磁盘(对应目录storage/app/),相对路径就是存在TemporaryFile模型里的path字段,修改move方法代码如下:

public function move(Request $request, Order $order)
{
    foreach ($request->temporary_files as $file)
    {
        $relativePath = $file['path'];
        // 从local磁盘读取相对路径文件并添加到媒体库
        $media = $order->addMediaFromDisk($relativePath, 'local')->toMediaCollection();

        $media->update([
            'name' => $file['name'],
            'file_name' => $file['file_name']
        ]);
        
        // 可选:转移完成后删除临时文件,释放存储空间
        Storage::delete($relativePath);
    }
}
额外优化建议

上传临时文件时避免直接用客户端原始文件名,防止重名文件被覆盖,建议生成唯一文件名:

// 替换上传逻辑中的文件名生成部分
$fileName = Uuid::uuid4()->toString() . '.' . $file->getClientOriginalExtension();
Storage::put('temporaryFiles/'.$fileName, $file->getContent());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:59:53