7

Sie haben versucht, ohne ein Bild von React Native mit vor-signierter URL in S3 hochzuladen. Hier ist mein Code:Native Upload auf S3 mit vorgebrachter URL reaktivieren

erzeugen Pre-signierten URL in Knoten:

const s3 = new aws.S3(); 

const s3Params = { 
    Bucket: bucket, 
    Key: fileName, 
    Expires: 60, 
    ContentType: 'image/jpeg', 
    ACL: 'public-read' 
}; 

return s3.getSignedUrl('putObject', s3Params); 

hier ist RN Anfrage S3:

var file = { 
    uri: game.pictureToSubmitUri, 
    type: 'image/jpeg', 
    name: 'image.jpg', 
}; 

const xhr = new XMLHttpRequest(); 
var body = new FormData(); 
body.append('file', file); 
xhr.open('PUT', signedRequest); 
xhr.onreadystatechange =() => { 
    if(xhr.readyState === 4){ 
    if(xhr.status === 200){ 
     alert('Posted!'); 
    } 
    else{ 
     alert('Could not upload file.'); 
    } 
} 
}; 
xhr.send(body); 

game.pictureToSubmitUri = assets-library://asset/asset.JPG?id=A282A2C5-31C8-489F-9652-7D3BD5A1FAA4&ext=JPG

signedRequest = https://my-bucket.s3-us-west-1.amazonaws.com/8bd2d4b9-3206-4bff-944d-e06f872d8be3?AWSAccessKeyId=AKIAIOLHQY4GAXN26FOQ&Content-Type=image%2Fjpeg&Expires=1465671117&Signature=bkQIp5lgzuYrt2vyl7rqpCXPcps%3D&x-amz-acl=public-read

Fehlermeldung:

<Code>SignatureDoesNotMatch</Code> 
<Message> 
The request signature we calculated does not match the signature you provided. Check your key and signing method. 
</Message> 

Ich kann erfolgreich curl und Bild S3 die erzeugte URL, und ich scheinen in der Lage zu sein, erfolgreich von RN requestb.in Post (aber ich kann nur die Rohdaten auf requestb.in sehen so nicht 100% sicher, dass das Bild dort richtig ist).

auf all dieser Grundlage habe ich bis zu 1 mein Problem verengt) mein Bild ist Zeit nicht richtig hochladen, oder 2) irgendwie die Art und Weise S3 will meine Anfrage dann anders ist, wie es in.

kommt Jede Hilfe wäre muuuuucchhhh geschätzt!

UPDATE

erfolgreich von RN veröffentlichen können bis S3, wenn Körper nur Text ({ 'data': 'foo'}) ist. Vielleicht mag AWS keine mehrdimensionalen Daten? Wie kann ich nur eine Datei in RN schicken ???

+0

Nicht sicher, warum Ihre Signatur ungültig ist. Ich habe fast den gleichen Signaturcode und es funktioniert gut. Ihre leeren erfolgreichen Uploads sind darauf zurückzuführen, dass Sie einen Pfad als URI übergeben. 'file: /// var /.../ 4BBAE22E-DADC-4240-A266-8E469C0636B8.jpg' sollte funktionieren. –

+0

Hat Ihr AWS Secret Key eine abschließende Weiterleitung "/"? – error2007s

+0

@DanielBasedow Ich glaube nicht, dass die Signatur ungültig ist. Ich kann locken, um Bilder damit hochzuladen. Ich denke, etwas stimmt nicht damit, wie meine RN-Anfrage formuliert wird? – Cole

Antwort

8

FormData wird eine multipart/form-data Anfrage erstellen. S3 PUT Objekt benötigt seinen Anfragetext als Datei.

Sie müssen nur Ihre Datei in der Anfrage Körper zu senden, ohne es in FormData Verpackung:

function uploadFile(file, signedRequest, url) { 
    const xhr = new XMLHttpRequest(); 
    xhr.open('PUT', signedRequest); 
    xhr.onreadystatechange = function() { 
    if (xhr.readyState === 4) { 
     if(xhr.status === 200) { 
     alert(url); 
     } else { 
     alert('Could not upload file.'); 
     } 
    } 
    }; 
    xhr.send(file); 
}; 

Siehe https://devcenter.heroku.com/articles/s3-upload-node zum Beispiel in einem Browser. Bitte stellen Sie auch sicher, dass Ihre Kopfzeile Content-Type mit der signierten URL-Anfrage übereinstimmt.

+0

Vielen Dank so glücklich, das funktioniert jetzt! – Cole

+2

Können Sie sicherstellen, dass der Content-Type-Header mit der signierten URL-Anfrage übereinstimmt? Ich verstehe nicht ganz, was du damit meinst. –

+1

Sie müssen nur 'xhr.setRequestHeader ('Content-Type', fileType) setzen' –