我正在尝试生成其他系统可用于将文件上传到我的S3存储桶的URL。我查看了文档和类似的问题,但是,我找不到合适的解决方案。
我尝试过多种方式创建PreSigned网址($this->s3
是S3Client的引用):
1:
$signedUrl = $this->s3->getCommand(
'PutObject',
array(
'Bucket' => $this->bucket,
'Key' => 'recording_test.mp3',
'Body' => ''
)
)->createPresignedUrl('+2 hours');
2:
$command = $this->s3->getCommand('PutObject', array('Bucket' => $this->bucket, 'Key' => 'recording_test3.mp3', 'Body' => ''));
$request = $command->prepare();
$signedUrl = $this->s3->createPresignedUrl($request, '+2 hours');
当尝试简单地访问URL时,我得到以下错误:
The request signature we calculated does not match the signature you provided. Check your key and signing method.
我也是这样试过的: $ key =' recording_test2.mp3&#39 ;; $ url = $ this-> bucket。' /'。$ key;
$request = $this->s3->put($url);
$signedUrl = $this->s3->createPresignedUrl($request, '+2 hours');
但是,这会生成格式为s3.amazonaws.com/bucket/key...
的URL,这会产生有关无效端点的错误,并且应使用格式为bucket.s3.amazonaws.com/key...
的端点。手动更改URL会产生与上述相同的无效签名错误。
我看不出我做错了什么或以其他方式生成PreSigned网址?
感谢您的帮助
答案 0 :(得分:0)
创建签名网址时,不应使用Body
密钥。生成的签名URL包括要上载的正文的签名。然后,当您尝试使用URL上传文件时,它无法将您正在使用的空字符串与文件内容相匹配。
此外,如果您使用Curl放置文件,我建议使用\ CURLFile,并记住使用curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
作为您的PUT请求。