2016-04-17 20 views
0

私は仕事のために簡単なテストを受けるのに大いに時間をかけてきました。私は、反応したネイティブのモバイルアプリで作業しています。私は、presigned URLを生成し、s3にビデオファイルをアップロードするためにそのURLを使用します。 予約済みのURLを使用して画像をS3にアップロード

const file = fs.readFileSync('./video.mp4') 
s3.getSignedUrl('putObject', {Bucket: 'mybucket', Key: 'video.mp4'}, (err, url) => { 
    if (err) { console.log(err); } 
    else { 
    fetch(url, { 
     method: 'PUT', 
     body: file 
    }) 
    .then(success => console.log(success.status)) 
    .catch(e => console.log(e)) 
    }) 
}) 

は、私が200のステータスコードを取得しますが、S3に表示される「file」は0バイトを持っている:私は現在だけで行うことで、このアプローチをテストしようとしています。 fs.readFileSyncを介して受け取ったファイルをアップロードしようとすると、同じことが起こっていることに気付きました。 私は一時的にfs.readFileSync( './ video.mp4'、 'base64')をやっていたが、私のビデオでは元の形式でアクセスする必要があるため、これはアプリケーションでは機能しません。 base64文字列として返します。私もs3.uploadをうまく使いましたが、s3とのやりとりを許可する前にサーバ上のすべてのユーザのアクションを認証したいので、私のアプリでもうまくいきません。 私は本当にいくつかのアドバイスをお待ちしています。私は一日中ContentTypesとContentLengthを使っていました。

+0

あなたはTUがオブジェクトを入れてもらうこの方法に従ってください? - > [AWSJavaScriptSDK](http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-examples.html) – aldanux

答えて

3

あなたは次のようにfileという名前のパラメータを使用してファイルをラップするFormDataを使用する必要があります。

var body = new FormData(); 
body.append('file', file); 
fetch(url, { method: 'PUT', body: body }); 
+0

ありがとうございます。これは最高です!ありがとうございました。フェッチAPIはノードバッファを処理できないようです。 FormDataでラップしてもリクエストAPIを使用しても、この問題は解決されます。 – user2689931

+1

簡単な質問:私はこのアプローチをネイティブ自身で行うと、S3で終わるビデオには最初にコンテンツにいくつかの頭が付いていて、ファイルが再生できなくなります。追加情報なしで動画をアップロードする方法に関するアイデアはありますか? – user2689931

+1

これは反応がネイティブの問題で、アップロードに不正なコンテンツタイプを使用します。 アップロードにxhrを使用して問題を修正しました。 FormData + fetchを使用する代わりに、https://facebook.github.io/react-native/docs/network.html#xmlhttprequestのxhrの使用法を参照してください。最後のキーは 'xhr.send({uri:uri、type: 'video/mp4 '}) 'あなたのために。 –

関連する問題