【发布时间】:2016-05-30 14:32:51
【问题描述】:
我试图在一个相当旧的网络服务器上设置一个上传过程,这样当用户向它上传一个新文件时,客户端首先向网络服务器发送一个请求(没有文件),这会做一些处理并返回一个预签名的 URL,这将允许客户端将文件直接上传到 S3。
需要注意的是,由于服务器上安装的 PHP 版本,我使用的是 AWS SDK for PHP v2。
我可以使用以下代码创建预签名 URL:
$s3Client = Aws\S3\S3Client::factory(array(
'key' => "xxxxxxxxxxxxxxxxxxxx",
'secret' => "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
));
$command = $s3Client->getCommand('PutObject', array(
'Bucket' => 'bucketname',
'Key' => $this->_id.'/model.xyz',
'Body' => '',
'ContentMD5' => false,
'ContentType' => 'multipart/form-data',
));
return $command->createPresignedUrl('+20 minutes');
这成功创建了一个 URL,该 URL 被传递给客户端。但是,在将后续请求发送到 S3 时,我收到此错误:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
<AWSAccessKeyId>xxxxxxxxxxxxxxxxxxxxxxx</AWSAccessKeyId>
<StringToSign>POST
multipart/form-data; boundary=----WebKitFormBoundaryLFAYOUC0JsblZJHj
1464614702
/bucketname/blah/model.xyz</StringToSign>
<SignatureProvided>xxxxxxxxxxxxxxxxxxxxxxxxxxx</SignatureProvided>
<StringToSignBytes>xx xx xx xx xx xx xx xx xx xx xx...</StringToSignBytes>
<RequestId>XXXXXXXXXXXXXXXXXXXX</RequestId>
<HostId>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</HostId>
</Error>
我刚刚创建了所使用的访问密钥和密钥(用户拥有足够的权限),所以不正确的密钥不是问题。
请求标头:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:50145
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryLFAYOUC0JsblZJHj
Host:bucketname.s3.amazonaws.com
Origin:http://website.com
Pragma:no-cache
Referer:http://website.com/script.php
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
此处显示的内容长度不同,但这很重要吗?鉴于 URL 是在文件上传之前生成的,我不确定如何获取该信息。
如果有人发现上述任何明显错误会导致此失败,任何建议将不胜感激。
【问题讨论】: