2016-07-31 9 views
1

zurück Ich bin relativ neu in AWS. Ich habe nur versucht, ein Bild von meiner App auf aws S3 hochzuladen und es herunterzuladen, um das Bild auf einer anderen Seite in der App anzuzeigen. Der Upload war erfolgreich und konnte das hochgeladene Bild in S3 sehen. Aber es konnte nicht heruntergeladen werden, da es den folgenden Fehler auslöst.Bild konnte nicht mit s3 getSignedUrl ('getObject ..) heruntergeladen werden und gibt die Signatur nicht

 FileTransferError {body = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we 
calculated does not match the signature you provided. Check your key and signing 
method.</Message><AWSAccessKeyId>AKXXXXXXXXXXXXXXXXXX</AWSAccessKeyId> 
<StringToSign>GET\n\n\n1469897687\n/huntuploads/uploads/%25222a85a6675d15eeeca5c8b 
da6eed4c52e%2522</StringToSign> 
<SignatureProvided>cUBhtiA5AGJbj8vl%2FX6xi%2B9BBRY%3D</SignatureProvided> 
<StringToSignBytes>47 45 54 0a 0a 0a 31 34 36 39 38 39 37 36 38 37 0a 2f 68 75 6e 
74 66 6f 6f 64 75 70 6c 6f 61 64 73 2f 75 70 6c 6f 61 64 73 2f 25 32 35 32 32 32 
61 38 35 61 36 36 37 35 64 31 35 65 65 65 63 61 35 63 38 62 64 61 36 65 65 64 34 
63 35 32 65 25 32 35 32 32</StringToSignBytes> 
<RequestId>CCB513320456EB6B</RequestId> 
<HostId>v4c7Ozf911tErWo5dCsL9RNLL78r3rUE6234Z801ZFXuELrji4juDehHmaxnK8t5qMBGcjz90a 
I=</HostId></Error>"; 
     code = 3; 
     "http_status" = 403; 
     source = "https://huntuploads.s3-us-west- 
2.amazonaws.com/uploads/%25222a85a6675d15eeeca5c8bda6eed4c52e%2522? 
AWSAccessKeyId=AKXXXXXXXXXXXXXXXXXX&Expires=1469897687&Signature=cUBhtiA5AGJbj8vl% 
252FX6xi%252B9BBRY%253D"; 
     target = "file:///var/mobile/Containers/Data/Application/1EB46B25-8BC5- 
46C9-BE6B-BF1E120B7627/Documents/%222a85a6675d15eeeca5c8bda6eed4c52e%22"; 
} 

Hier ist der folgende Code das Bild für das Hochladen, die auf der Serverseite

var AWS = require('aws-sdk'); 
    AWS.config.update({accessKeyId: 'AXXXXXXXXX......', secretAccessKey: 'XXXXX....'}); 
    AWS.config.update({region: 'us-west-2'}); 

var s3 = new AWS.S3({ params: {Bucket: 'huntfooduploads'}}); 

app.post('/FileUpload', function(req, res, next) { 
var fileStream = fs.createReadStream(req.files.file.path); 
      var params = { 
       'Key': 'uploads/' + req.files.file.name, 
       'Body': fileStream, 
       'ContentEncoding': 'base64', 
       'Content-Type ': 'image/jpeg' 
      }; 

    s3.upload(params, function(err, data) { 
     if (err) throw err; 
     console.log('after s3 upload====', err, data); 
     var imgFileInfo = req.files; 
     var imgUploadData = data; 
     .... 
    } 
} 

Hier ist der folgende Code verwendet zum Herunterladen des Bildes mit getSignedUrl für s3 von Server-Seite

gut funktioniert
var urlParams = {Bucket: 'huntuploads', Key:'uploads/'+rows[0].MyHunt_FileName}; 

    // s3 getSigned Url 
    s3.getSignedUrl('getObject', urlParams, function(err, url) { 
     if (err) throw callback(err); 
     var fullUrl={awsUrl:url}; 
     res.send(fullUrl); 
    }) 

Sobald ich die FullUrl zurück zu Client-Seite, die App ist, senden, habe ich versucht, mit der folgenden

Von der App Seite, als ich versuchte, das Bild herunterzuladen, bekomme ich die oben genannte Nachricht. Ich versuchte mit nx-amz-Server-Side-Verschlüsselung-Kunden-Algorithmus: AES256 als Header. Ich brauche die folgenden

  1. Ist dies die richtige Methode der Weitergabe der Daten vom Server zum Client (app)
  2. Wenn die urlParams für getSigned URL zu wissen, korrekt ist. Ich bin mir nicht sicher, ob ich etwas vermisse oder was zu tun ist.

Kann mir jemand in die richtige Richtung beraten.

+0

Warum ist Ihr Objektschlüssel 'uploads /" 2a85a6675d15eeeca5c8bda6eed4c52e "' mit doppelten Anführungszeichen? Obwohl es technisch nicht "falsch" ist, ist es ungewöhnlich und trägt zu dem Problem bei, das Sie erleiden - anscheinend Doppel-URL-Escaping. Um festzustellen, wo der Fehler auftritt, muss ich etwas anderes verstehen ... in der signierten URL, die Sie generieren, sehen Sie 'uploads /% 25222a ...' oder ist es nur 'uploads /% 222a ...'? –

+0

Hallo Michael, Danke für deine Antwort. Ich fand auch, dass die Signatur geändert wurde "uploads /% 25222a" anstelle von "uploads /% 222a ...". Ich bin mir nicht sicher warum. Ich habe sogar die vollständige URL überprüft, die ich auf der Client-Seite (App) erhalte. Und in diesem Fall meine ich "itemData [3] .awsUrl", was "% 222a" anzeigt. Aber wenn ich dies als Parameter übergeben an $ CordovaFileTransfer.download (encodeURI (itemData [3] .awsUrl) ..) und führe das aus, konvertiert es "% 222a .."to" /% 25222a ... ". Ich habe es sogar ohne encodedURI versucht, nur indem ich die vollständige URL als Parameter übergeben habe. Auch das hat nicht geklappt. Nicht sicher, ob FileTransfer Probleme hat. – Brad

+0

Hallo Michael, basierend auf deinem Vorschlag denkst du, dass dies der richtige Weg ist, um den Key hinzuzufügen, während du das Bild hochlädst, 'Key': 'uploads /' + req.files.file.name. ' – Brad

Antwort

0

Soweit ich weiß, ist getSignedUrl Funktion nicht Datei existiert überprüfen,

1-Stellen Sie sicher, Ihre Datei-URL korrekt ist (nicht URL unterzeichnet).

2-Stellen Sie sicher, Erlaubnis und Zugriff auf Ihre Eimer sind richtig

Schließlich überprüfen Sie Datum und Uhrzeit des Gerätes, wenn Sie die getSignedUrl Funktion aufrufen.

+0

Keiner dieser Vorschläge ist wirklich anwendbar, weil keines dieser Probleme den 'SignatureDoesNotMatch'-Fehler verursachen würde - was immer nur eines bedeutet: Die Signatur stimmt nicht mit den Anmeldeinformationen und der Anforderung überein, und es wurde keine weitere Verarbeitung durchgeführt. 1. Es spielt keine Rolle, ob das Objekt existiert. Wenn das das Problem wäre, wäre der Fehler "NoSuchKey" oder "AccessDenied", je nachdem, ob der signierende Benutzer die Berechtigung zum Auflisten von Objekten hat. 2. Der Fehler wäre in diesem Fall einfach "AccessDenied". –

1

Nun, ich habe mich selbst gelöst. Aber danke für deine Hilfe Michael und andere. Die Lösung ist, dass ich die folgende Zeile als Optionen in einem der

hinzugefügt wurde var options = {encodeURI: false}; und dann cordovaFileTransfer.download (encodeURI (itemData [3] .awsUrl), targetPath, Optionen, trustHosts) {...}

, die das Problem behoben. Offenbar ist encodeUI standardmäßig auf "true" gesetzt, was die Signatur veränderte.