2016-05-30 6 views
1

かなり古い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が生成されているとすれば、どうにかその情報を取得する方法はわかりません。

誰かが明らかに間違っていることを見て、この失敗の原因となる上記のものがあれば、助言をいただければ幸いです。

答えて

0

POSTアップロードには、事前に署名されたPUT URLを使用することはできません。

署名付きポリシー文書(アップロードの許容属性を記述するbase64エンコードJSON)、署名、およびフォームに埋め込まれた実際のファイルのコンテンツタイプなどの他の属性を使用します。

シグネチャバージョン2では、ポリシー、署名、およびフォームの構成はhttp://docs.aws.amazon.com/AmazonS3/latest/dev/UsingHTTPPOST.htmlに記載されています。

シグネチャバージョン4については、同じ情報がhttp://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-authentication-HTTPPOST.htmlです。

「シグネチャバージョン」は、SDKのバージョンには関係しません。すべての地域でSIG V4がサポートされています。 2014年以前に開始された地域でもSig V2がサポートされていますが、これは最初から実装するのがやや簡単です。

私は、これはPHP V2 SDKのドキュメントでは一切触れられていないので、言及しました。

+0

ありがとうございました。私は現在、SDKからのリクエストに必要なすべての情報を実際に取得する方法に苦労しています - あなたはここに何か提案がありますか? –

+0

私は、この特定のSDKが多くの助けになるとは確信していません。私はいつも、リクエスト署名、ポリシー生成などのために自分のコードをすべて書きましたが、PHPの人ではありません。 –

関連する問題