2016-04-17 7 views
0

Ich habe eine Menge Zeit damit verbracht, einen einfachen Test zur Arbeit zu bringen. Ich arbeite an einer mobilen App in Reaktion nativ. Ich möchte eine vordefinierte URL generieren und diese URL verwenden, um eine Videodatei auf s3 hochzuladen. Ich versuche zur Zeit nur diesen Ansatz zu testen, indem Sie:Laden Sie das Image mit der vordefinierten URL in S3 hoch.

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)) 
    }) 
}) 

ich einen 200-Statuscode erhalten, aber die ‚Datei‘, die auf S3 erscheint hat 0 Byte. Ich habe festgestellt, dass das Gleiche passiert, wenn ich versuche, ALLE Dateien, die ich über fs.readFileSync erhalten habe, hochzuladen. Ich habe es geschafft, dies temporär zu umgehen, indem ich fs.readFileSync ('./ video.mp4', 'base64') mache, aber das funktioniert nicht in meiner App, weil ich auf das Video im Originalformat zugreifen muss, nicht als Base64-String. Ich habe auch erfolgreich s3.upload verwendet, aber das funktioniert auch nicht in meiner App, weil ich alle Aktionen meines Benutzers auf meinem Server authentifizieren möchte, bevor ich ihnen die Erlaubnis gebe, eine Interaktion mit s3 zu machen. Ich würde wirklich einige Ratschläge appreciate. Ich habe den ganzen Tag mit ContentTypes und ContentLengths herumgespielt.

+0

Sie folgen auf diese Weise tu setzen und erhalten Objekt? -> [AWSJavaScriptSDK] (http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-examples.html) – aldanux

Antwort

3

Sie müssen FormData benutzen, um Ihre Datei mit dem Parameter file wie folgt benannt zu wickeln:

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

Vielen Dank. Das ist fantastisch! Vielen Dank. Es scheint, dass die Abruf-API keine Knotenpuffer verarbeiten kann. Sowohl das Umbrechen in FormData als auch das Verwenden der Anforderungs-API lösen dieses Problem. – user2689931

+1

Schnelle Frage: Wenn ich diesen Ansatz nativ selbst durchführe, werden am Anfang des Videos, das auf S3 endet, einige Köpfe an den Inhalt angehängt, was die Datei unspielbar macht. Haben Sie Ideen, wie Sie das Video hochladen können, ohne dass zusätzliche Informationen hinzugefügt werden? – user2689931

+1

Es handelt sich um ein reaktives natives Problem, sie verwenden einen falschen Inhaltstyp zum Hochladen. Ich habe das Problem behoben, indem ich xhr zum Hochladen verwendete. Anstatt FormData + fetch zu verwenden, sehen Sie sich die xhr-Verwendung in https://facebook.github.io/react-native/docs/network.html#xmlhttprequest an. Der letzte Schlüssel ist 'xhr.send ({uri: uri, type: 'video/mp4 '}) 'für dich. –

Verwandte Themen