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

Laravel 8使用Http::attach上传文件时出现「A 'contents' key is required」异常求助

解决Laravel 8 HTTP客户端上传文件时的"InvalidArgumentException A 'contents' key is required"错误

我来帮你排查这个问题,这个错误通常和Laravel HTTP客户端(底层基于Guzzle)处理multipart请求的机制有关,下面是几个可能的原因和对应的解决办法:


1. 移除手动设置的Content-Type: multipart/form-data头部

这是最常见的触发原因:当你使用Http::attach()方法时,Laravel会自动帮你生成正确的Content-Type头部(包含multipart请求必需的边界标识)。如果手动设置这个头部,会覆盖Laravel自动生成的内容,导致Guzzle无法正确构建multipart表单结构,进而抛出这个错误。

修改后的代码示例:

$response = Http::attach('InputFile0', file_get_contents('test.docx'), 'test.docx')
    ->withHeaders([
        'Authorization' => 'Bearer XYZ',
        'X-API-Key' => 'ABC123',
        // 移除这一行手动设置的Content-Type
    ])
    ->post('https://cpf-ue1.adobe.io/ops/:create', $data);

2. 检查$data变量的内容格式

如果上面的修改无效,问题大概率出在你传入的$data数组里。Guzzle处理multipart表单时,要求每个字段都必须有有效的contents值,以下几种情况会触发错误:

  • $data中包含值为null的字段
  • $data中包含未正确序列化的数组(Guzzle无法直接处理数组类型的表单字段)
  • $data中包含空字符串以外的空值类型

对应解决办法:

  • 过滤掉$data中值为null的字段:
    $data = array_filter($data, fn($value) => $value !== null);
    
  • 如果需要传递数组类型的参数,将其序列化为JSON字符串:
    $data = [
        'metadata' => json_encode(['title' => 'Test Document', 'author' => 'Me']),
        // 其他普通字段...
    ];
    

3. 确保流资源处于可读状态(当使用流上传时)

虽然你已经确认流资源正常,但有时候流的指针可能意外走到了文件末尾(eof: true),导致Guzzle无法读取内容。可以尝试重置流指针后再使用:

$file = fopen('test.docx', 'r');
rewind($file); // 将流指针重置到文件开头

$response = Http::attach('InputFile0', $file, 'test.docx')
    ->withHeaders([
        'Authorization' => 'Bearer XYZ',
        'X-API-Key' => 'ABC123',
    ])
    ->post('https://cpf-ue1.adobe.io/ops/:create', $data);

fclose($file); // 记得关闭流资源

4. 查看详细异常栈定位问题

如果以上方法都没用,建议打开Laravel的日志文件(storage/logs/laravel.log),找到这个异常的完整调用栈。通过栈信息你可以看到Guzzle在处理哪个字段时抛出的错误,这样就能精准定位问题所在(比如某个特定的表单字段格式错误)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:17:48