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 funktioniertvar 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
- Ist dies die richtige Methode der Weitergabe der Daten vom Server zum Client (app)
- 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.
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 ...'? –
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
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