一直試圖沒有運氣,使用預先簽名的URL從React Native上傳圖像到S3。這裏是我的代碼:反應原生上傳到S3與預先註冊的網址
在節點生成預簽名網址:
const s3 = new aws.S3();
const s3Params = {
Bucket: bucket,
Key: fileName,
Expires: 60,
ContentType: 'image/jpeg',
ACL: 'public-read'
};
return s3.getSignedUrl('putObject', s3Params);
這裏是RN請求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
錯誤消息:
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your key and signing method.
</Message>
我可以使用生成的URL成功捲曲和形象S3,我似乎能夠成功後從RN(但是我只能看到requestb.in原始數據,這樣不會requestb.in 100%確定圖像正確)。
基於這一切,我已經收窄我的問題降到1)我的形象是不正確上傳週期,或2)莫名其妙的方式S3希望我的要求是不同的它是那麼如何在未來。
任何幫助將muuuuuucchhhh讚賞!
UPDATE
能否成功地從RN發佈到S3,如果身體是文本({ '數據': '富'})。也許AWS不喜歡多重數據?我怎樣才能發送只在RN中的文件?
不確定您的簽名無效的原因。我有幾乎相同的簽名代碼,它工作正常。您的空白成功上傳是由於您將路徑作爲URI傳遞。 'file:/// var /.../ 4BBAE22E-DADC-4240-A266-8E469C0636B8.jpg'應該可以工作。 –
您的AWS密鑰是否有任何後續轉發「/」? – error2007s
@DanielBasedow我不認爲簽名是無效的。我可以用它來上傳圖片。我認爲我的RN請求正在形成的過程中出現了問題? – Cole