かなり古いWebサーバーでアップロードプロセスを設定しようとしているので、ユーザーが新しいファイルをアップロードすると、何らかの処理を行い、クライアントがファイルを直接S3にアップロードできるようにする事前署名されたURLを返す(ファイルなしで)Webサーバーに要求します。AWS SDK for PHP v2でファイルをアップロードするための事前設定済みのPOST URLを作成
私は、サーバーにインストールされているPHPのバージョンのため、PHP用のAWS SDKのv2を使用しています。
私は、次のコードを使用してpresigned 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を、作成します。しかし、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が生成されているとすれば、どうにかその情報を取得する方法はわかりません。
誰かが明らかに間違っていることを見て、この失敗の原因となる上記のものがあれば、助言をいただければ幸いです。
ありがとうございました。私は現在、SDKからのリクエストに必要なすべての情報を実際に取得する方法に苦労しています - あなたはここに何か提案がありますか? –
私は、この特定のSDKが多くの助けになるとは確信していません。私はいつも、リクエスト署名、ポリシー生成などのために自分のコードをすべて書きましたが、PHPの人ではありません。 –