使用预先签名的URL将图像上传到S3

时间:2016-04-17 21:12:14

标签: javascript amazon-web-services amazon-s3 aws-sdk

我一直有一段时间让一个简单的测试工作。我正在开发一个反应原生的移动应用程序。我想生成一个预先签名的URL并使用该URL将视频文件上传到s3。我目前只是试图通过这样做来测试这种方法:

const file = fs.readFileSync('./video.mp4')
s3.getSignedUrl('putObject', {Bucket: 'mybucket', Key: 'video.mp4'}, (err, url) => {
  if (err) { console.log(err); }
  else {
    fetch(url, {
       method: 'PUT',
       body: file
    })
    .then(success => console.log(success.status))
    .catch(e => console.log(e))
  })
})

我收到200状态代码,但是'文件'出现在S3上有0个字节。我注意到当我尝试上传通过fs.readFileSync收到的任何文件时,会发生同样的事情。 我设法暂时解决这个问题fs.readFileSync(' ./ video.mp4',' base64'),但这不能在我的应用中运行,因为我需要以原始格式访问视频,而不是base64字符串。我也成功地使用了s3.upload,但是我的应用程序也无法工作,因为在我授权他们与s3进行交互之前,我想在我的服务器上验证所有用户的操作。 我真的应该提出一些建议。我整天都在使用ContentTypes和ContentLengths。

1 个答案:

答案 0 :(得分:6)

您需要使用FormData用名为file的参数包装文件,如下所示:

var body = new FormData();
body.append('file', file);
fetch(url, { method: 'PUT', body: body });