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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:35:29