是否可以使用POST直接从URL上传到S3?

时间:2011-09-28 16:36:21

标签: amazon-web-services amazon-s3

我知道有一种方法可以使用POST直接从Web浏览器上传到S3,而不会将文件发送到您的后端服务器。但有没有办法从URL而不是Web浏览器中执行此操作。

示例,使用post将位于http://example.com/dude.jpg的文件直接上传到S3。我的意思是我不想将资产下载到我的服务器然后将其上传到S3。我只想向S3发出POST请求并自动上传。

3 个答案:

答案 0 :(得分:26)

听起来您希望S3本身从远程服务器下载文件,您只需将资源的URL传递给S3。

S3目前不支持此功能。

它需要一个API客户端来实际将对象的内容传输到S3。

答案 1 :(得分:1)

我发现这篇文章有一些细节。您可能必须以某种方式修改存储桶的安全设置以允许此类交互。

http://aws.amazon.com/articles/1434

客户端也会遇到一些安全问题,因为您从不希望您的密钥可公开访问

答案 2 :(得分:0)

我认为我应该分享我的代码以实现类似的目的。我当时在后端上工作,但可能会在前端做类似的事情,尽管要注意 AWS凭证可能会公开

出于我的目的,我想从外部URL下载文件,然后最终取回上载文件的URL表格S3。

我还使用axios来获取可上传的格式,并使用file-type来获取正确的文件类型,但这不是必需的。

下面是我的代码段:

async function uploadAttachmentToS3(type, buffer) {
  var params = {
   //file name you can get from URL or in any other way, you could then pass it as parameter to the function for example if necessary
    Key : 'yourfolder/directory/filename', 
    Body : buffer,
    Bucket : BUCKET_NAME,
    ContentType : type,
    ACL: 'public-read' //becomes a public URL
  }
  //notice use of the upload function, not the putObject function
  return s3.upload(params).promise().then((response) => {
    return response.Location
  }, (err) => {
    return {type: 'error', err: err}
  })
}

async function downloadAttachment(url) {
  return axios.get(url, {
    responseType: 'arraybuffer'
  })
  .then(response => {
    const buffer = Buffer.from(response.data, 'base64');
    return (async () => {
      let type = (await FileType.fromBuffer(buffer)).mime
      return uploadAttachmentToS3(type, buffer)
    })();
  })
  .catch(err => {
    return {type: 'error', err: err}
  });  
}

let myS3Url = await downloadAttachment(url)

我希望它可以帮助仍在解决类似问题的人们。祝你好运!