我知道有一种方法可以使用POST直接从Web浏览器上传到S3,而不会将文件发送到您的后端服务器。但有没有办法从URL而不是Web浏览器中执行此操作。
示例,使用post将位于http://example.com/dude.jpg的文件直接上传到S3。我的意思是我不想将资产下载到我的服务器然后将其上传到S3。我只想向S3发出POST请求并自动上传。
答案 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)
我希望它可以帮助仍在解决类似问题的人们。祝你好运!