反应原生上传到S3与预先注册的网址
一直试图没有运气,使用预先签名的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中的文件?
FormData
将创建一个multipart/form-data
请求。 S3 PUT
对象需要它的请求体为文件。
你只需要发送文件请求体不包成FormData
:
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);
};
见https://devcenter.heroku.com/articles/s3-upload-node例如在浏览器中。请确保您的Content-Type
标题与签名的URL请求匹配。
非常感谢这个作品! – Cole
您可否详细说明确保Content-Type标头与签名的URL请求匹配?我不太明白你的意思。 –
你只需要设置'xhr.setRequestHeader('Content-Type',fileType)' –
不确定您的签名无效的原因。我有几乎相同的签名代码,它工作正常。您的空白成功上传是由于您将路径作为URI传递。 'file:/// var /.../ 4BBAE22E-DADC-4240-A266-8E469C0636B8.jpg'应该可以工作。 –
您的AWS密钥是否有任何后续转发“/”? – error2007s
@DanielBasedow我不认为签名是无效的。我可以用它来上传图片。我认为我的RN请求正在形成的过程中出现了问题? – Cole