Laravel Job向外部API传文件报错:文件路径不存在如何修复?
问题修复方案
错误根源
问题出在传递给Job的是相对路径,队列进程的工作目录与Web请求进程的工作目录不一致,导致fopen无法定位到文件;同时Sail(Docker)环境下必须使用容器内部的正确绝对路径才能访问文件。
具体修复步骤
1. 控制器传递文件绝对路径
修改控制器代码,将store返回的相对路径转换为容器内的绝对路径后再传给Job:
public function processImage(Request $request): JsonResponse { $request->validate([ 'image' => 'image|mimes:jpeg,jpg,png,gif' ]); $file = $request->file('image'); $relativePath = $file->store('temp'); // 转换为容器内的绝对路径 $absolutePath = storage_path('app/' . $relativePath); ProcessImageJob::dispatch($absolutePath); $jobStatusId = 1; return response()->json(compact('jobStatusId')); }
2. Job中使用绝对路径打开文件
修改Job代码,直接使用传递的绝对路径,同时动态获取文件MIME类型避免硬编码:
$client = new Client(); $response = $client ->post($uploadUrl, [ 'headers' => $this->authHeaders, 'multipart' => [ [ 'name' => 'files', 'contents' => fopen($this->image, 'r'), 'headers' => [ 'Content-Type' => mime_content_type($this->image)] ], ] ]); $response = json_decode($response->getBody()->getContents(), true);
3. 确保Sail环境下的目录权限与存在性
- 确认容器内
storage/app/temp目录存在:项目根目录执行sail mkdir -p storage/app/temp - 修正目录权限:执行
sail chmod -R 775 storage/app/temp,确保Laravel进程拥有读写权限
4. 可选:清理临时文件
Job执行完成后删除临时文件,避免存储空间浪费:
// 外部API调用完成后执行 if (file_exists($this->image)) { unlink($this->image); }
内容的提问来源于stack exchange,提问作者Cosmin Ciolacu
相关产品推荐
相关产品推荐

