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

