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

PHP AWS SDK使用预签名URL上传文件报KeyTooLongError错误

错误根因

你错误使用了AWS S3 SDK的putObject方法:该方法的Key参数仅接受S3对象的存储路径,不需要包含预签名URL的鉴权查询参数。你当前将包含X-Amz系列签名参数的完整串全部传入Key,整个字符串长度远超S3对象键1024字节的上限,因此触发KeyTooLongError报错。

curl请求正常的原因

curl直接请求完整预签名URL时,所有鉴权参数是放在URL的查询段,不属于S3对象键的一部分,不会触发键长限制,同时鉴权逻辑可以正常校验通过。

修复方案

可二选一处理:

  • 方案1:已有预签名URL的情况下,无需使用S3 SDK上传,直接用HTTP客户端请求该URL即可,示例如下:
// 你的完整预签名URL
$preSignedUrl = $result;
// 用Guzzle上传
$client = new \GuzzleHttp\Client();
$client->request('PUT', $preSignedUrl, [
    'body' => file_get_contents($fileData)
]);
  • 方案2:当前运行环境已经有S3 bucket的写入权限,无需使用预签名URL,直接修改Key参数为纯对象路径即可:
$client = new S3Client( [
    'version' => '2006-03-01',
    'region'  => 'eu-west-1',
    'validate' => false
] );
$params = [
    'Bucket' => env('RESULTS_UPLOAD_SERVICE_BUCKET'),
    // 仅传入纯对象路径,不要加后面的鉴权参数
    'Key'    => 'hl7/1/2df8c3ef-8eca-4e19-aae0-41b074f37c8e.hl7',
    'Body'   => file_get_contents($fileData)
];
$response = $client->putObject($params);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:45:03