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
相关产品推荐
相关产品推荐

