一直在尝试使用预签名的 url 从 React Native 将图像上传到 S3,但没有成功。这是我的代码:
在节点中生成预签名的 url:
const s3 = new aws.S3();
const s3Params = {
Bucket: bucket,
Key: fileName,
Expires: 60,
ContentType: 'image/jpeg',
ACL: 'public-read'
};
return s3.getSignedUrl('putObject', s3Params);
这是对 S3 的 RN 请求:
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
签名请求 =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 希望我的请求的方式与它的传入方式不同。
任何帮助将不胜感激!
更新
如果正文只是文本({'data': 'foo'}),则可以成功从 RN 发布到 S3。也许 AWS 不喜欢多种形式的数据?我怎样才能在 RN 中作为文件发送???