2016-10-06 5 views
1

他のシステムがS3バケットにファイルをアップロードするために使用できるURLを生成しようとしています。私はドキュメントと同様の問題を見て、しかし、私は適切な解決策を見つけることができません。PHP Amazon AWS S3 - 事前署名されたURLを使用してオブジェクトをアップロードする

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'); 

は、単にアクセスしようと

IはPreSigned URL複数の方法を作成しようとしている($this->s3はS3Clientそう参照です) URL次のエラーが表示される:

The request signature we calculated does not match the signature you provided. Check your key and signing method. 

私もこの方法で試しました: $ key = 'recording_test2.mp3'; $ url = $ this->バケット '/'。$ 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 URLを生成するのが間違っているやり方は何か分かりません。あなたの署名URLを作成する場合は、あなたがBodyキーを使用してはならない助け

+0

また、エラーの詳細には、 'StringToSign'フィールドがあります。これは、URLを開くかどうかによって異なります。あるいは、ファイルアップロードでフォームで使用します。もしそうなら、バケツにファイルをアップロードするためにURLが適切であることを確認するにはどうすればよいですか? – Giedrius

+0

あなたはまだ同じ問題があるかどうかはわかりませんが、putリクエストでリンクにアクセスする必要があります。 –

答えて

0

ため

感謝。生成された署名付きURLは、アップロードされる身体の署名を含む。次に、URLを使用してファイルをアップロードしようとすると、使用している空の文字列とファイルの内容が一致しません。

また、Curlを使用してファイルを保存する場合は、\ CURLFileを使用することをお勧めします。PUTリクエストにはcurl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");を使用することを忘れないでください。

関連する問題