从客户端下载AWS S3文件

时间:2018-09-28 10:12:43

标签: javascript node.js reactjs amazon-web-services amazon-s3

我目前正在尝试使用前端的按钮从s3存储桶下载文件。这怎么可能呢?我对如何开始这件事一无所知。我尝试进行研究,但没有运气-我搜索的所有内容都是关于 UPLOADING 文件到s3存储桶,而不是 DOWNLOADING 文件。提前致谢。

注意:我正在将其应用于 ReactJS(前端) NodeJS(后端),并且该文件是使用Webmerge上传的

更新:我正在尝试与此生成一个下载链接(即使我不是后端开发者,也尝试过节点)(lol)

查看下面的图片

what I have tried so far

onClick function

3 个答案:

答案 0 :(得分:3)

如果您要下载的文件不是公开的,则必须创建一个签名的URL才能获取该文件。

这里是获取非公开文件的解决方案,Javascript to download a file from amazon s3 bucket? 围绕着创建一个lambda函数,该函数将为您生成一个已签名的url,然后单击该按钮后使用该url下载文件

但是,如果您要下载的文件是公开的,则不需要签名的URL,只需要知道文件的路径即可,这些URL的结构如下:https://s3.amazonaws.com/ [文件路径] / [文件名]

它们还被AWS团队放大和创建。

只需遵循Get started,然后从您的react应用下载文件就可以了:

Storage.get('hello.png', {expires: 60})
.then(result => console.log(result))
.catch(err => console.log(err));

答案 1 :(得分:1)

这是我的解决方案:

let downloadImage = url => {
  let urlArray = url.split("/")
  let bucket = urlArray[3]
  let key = `${urlArray[4]}/${urlArray[5]}`
  let s3 = new AWS.S3({ params: { Bucket: bucket }})
  let params = {Bucket: bucket, Key: key}
  s3.getObject(params, (err, data) => {
    let blob=new Blob([data.Body], {type: data.ContentType});
    let link=document.createElement('a');
    link.href=window.URL.createObjectURL(blob);
    link.download=url;
    link.click();
  })
}

参数中的url指的是S3文件的url。

只需将其放入按钮的onClick方法中即可。您还需要AWS SDK

答案 2 :(得分:0)

谢谢,@ Jordan能够实现代码,并取得了成功。

import AWS from "aws-sdk"; //@package

<span  onClick={() => downloadImage(item.filename)} >download</span>

 const downloadImage = (filename) => {
 const s3 = new AWS.S3({
  accessKeyId: process.env.KEY_ID,
  secretAccessKey: process.env.SECRET_KEY,
});
s3.getObject({ Bucket: "bucket-name", Key: filename }, function (
  error,
  data
) {
  if (error != null) {
    alert("Object retrival was a failure");
  } else {
    let blob = new Blob([data.Body], { type: data.ContentType });
    let link = document.createElement("a");
    link.href = window.URL.createObjectURL(blob);
    link.download = filename;
    link.click();
  }
});

};

示例网址 https://bucket-name.s3.amazonaws.com/test.text