2016-11-27 20 views
0

サーバーに送信することなく、ファイルをS3にアップロードしようとしています。私はPUT私のバケツにファイルを格納する要求をすることができます私はS3 URLを署名したエンドポイントを持っています。S3に画像をアップロードできません

私はJavaScript側でいくつかのことを試みましたが動作しませんでした。ここで

(私は単純なファイルのアップロードとそれ以上何を探していますので、私はAmazonのSDKを使用していないよ、と、したくないことは)私はJavaScriptで現在何をしようとしているのです:

uploadToS3 =() => { 
    let file = this.state.files[0]; 
    let formData = new FormData(); 
    formData.append('Content-Type', file.type); 
    formData.append('file', file); 
    let xhr = new XMLHttpRequest(); 
    xhr.open('put', this.signed_url, true); 
    xhr.send(formData) 
}; 

私はたくさんのオプションを試しましたが、私は実際にアップロードの進捗を気にしないので、フェッチを使うことを好みます。私は上記のように試してみるためにどこかからxhrコードを使用しました。これらはネットワーク通話を行い、動作するはずのように見えますが、そうではありません。

私は公開URLに行くとオブジェクトがS3に作成され、ダウンロードされ、イメージビューアを使用して開くと有効なJPGではないと言われます。

アップロードを正しく行っていないと思っています。ここで

は、私は郵便配達で行う方法は次のとおりです。私は、URLを正しい署名していると私はリクエストにバイナリイメージファイルを添付しました

Postman with file chosen

注意してください。そして追加以下に示すように、コンテンツの種類を明記ヘッダは、画像/ JPEGです:私はS3にログインし、自分のバケットに行くとき

Specified headers

、私は画像を見ることができると私はそれが公共のURLとビューのに行くことができますブラウザで。これは完璧に機能し、まさに私が望むものです。今、JavaScriptでどのように達成できるかわかりません。

PS:郵便配達員のcodeをクリックしようとしましたが、私のファイルコードは生成されません。

+0

'xhr.send(formData)' ...意味がありません。 S3でファイルを 'PUT'するときには、*すべてのフォーム構造*を使用しません。本体を送信するだけです。 'Content-Type:'はリクエストヘッダに入ります。ボディのformdataには入りません。 (他のヘッダーでも同じです)。アップロードしたファイルをダウンロードし、テキストエディタで表示します。あなたのコードが実際にS3に送信されていることを確認すると、問題は非常に明白になるはずです.S3は従順に保存し、その後の要求に対応します。 –

+0

Wow @ Michael-sqlbot、私はもっと馬鹿だと感じることができませんでした:D私はこれを試したと思った。しかし、明らかにそれは今動作します。私はそれを受け入れることができるように答えとしてあなたのコメントを投稿できますか?ありがとう!あなたは私を救いました! –

+0

ありがとうございます。要求されたとおりに完了します。 –

答えて

1

ここで問題はxhr.send(formData)で始まります。

PUT S3のファイルでは、フォーム構造をまったく使用していないときは、要求本体に生のオブジェクトバイトを送信するだけです。

Content-Type:などのメタデータは、本文のフォームデータではなくリクエストヘッダーに格納されます。

この場合、アップロードされたファイルをダウンロードしてテキストエディタで表示すると、コードが実際にS3に送信している内容を確認した後、問題は非常に明白になるはずです。S3はその後順調に保存し、リクエスト。

S3にはbrowser-based form POST uploadsがサポートされていますが、署名処理が大幅に異なり、ポリシー文書を作成して署名する必要があるため、ポリシーや署名などのフォームをそれ以外は信頼できないユーザーがファイルをアップロードできるようにします。署名されたポリシーステートメントは、ブラウザーユーザーがフォームを改ざんして意図しないアクションを実行するのを防ぎます。

+0

ちょっと、もう1つの質問があります。ここに質問する必要があるかどうかわからない場合は $ config = [ 'Bucket' => env( 'BUCKET')、 'ACL' => 'public-read' 、 'Key' => $ key、 'CacheControl' => 'max-age = 172800'、 'Expires' =>新しい\ DateTime( '+ 2日')、 ]; if($ contentType){ $ config ['contentType'] = $ contentType; } $ request = $ this-> s3-> createPresignedRequest($ this-> s3-> getCommand( 'PutObject'、$ config)、$ expiry); 有効期限は考慮されません。私のイメージはキャッシュできません。何か案が? –

+0

申し訳ありませんが、コメントにコードを投稿する方法がわかりません。 –

+0

@NishchalGautam私はこれを新しい質問として投稿することをお勧めします。私と他の多くの専門家は、私たちの専門化の話題のすべての新しい質問の日中定期的な通知を受けます。質の高い質問には一般的に答えが出ません。ファイルをアップロードしてS3からダウンロードし、レスポンスヘッダーをキャプチャして質問に含めます。 '$ expiry'(正しく渡された場合)は、URLを生成した後にオブジェクトをアップロードするために事前署名されたURLをどれくらいの期間使用できるかを指定します。 –

関連する問題