Javascript从亚马逊s3存储桶下载文件?

IT技术 javascript amazon-web-services amazon-s3 download
2021-02-25 07:41:04

我试图从 Amazon S3 上的存储桶下载文件。我想知道我是否可以编写一个 javascript 来从存储桶中下载这样的文件。我在谷歌上搜索它,但找不到任何可以帮助我做到这一点的资源。

需要记住的一些步骤是:验证 Amazon S3,然后通过提供存储桶名称和文件(密钥),下载或读取文件,以便我能够显示文件中的数据。

谢谢,

3个回答

也许您可以使用AWS Node.js API

var AWS = require('aws-sdk');
AWS.config.update(
  {
    accessKeyId: ".. your key ..",
    secretAccessKey: ".. your secret key ..",
  }
);
var s3 = new AWS.S3();
s3.getObject(
  { Bucket: "my-bucket", Key: "my-picture.jpg" },
  function (error, data) {
    if (error != null) {
      alert("Failed to retrieve an object: " + error);
    } else {
      alert("Loaded " + data.ContentLength + " bytes");
      // do something with data.Body
    }
  }
);
是不是{ Bucket: "my-bucket", Key: "my-picture.jpg" }呢?(大写)
2021-04-17 07:41:04
这是AWS Node.js API 中s3.getObject的直接链接,供感兴趣的人使用。
2021-04-23 07:41:04
你总是可以在 Node 中保存(下载)这样的文件: fs.writeFile("mydata.tsv.gz", data.Body);
2021-05-02 07:41:04
alert对第一眼看到的服务器端代码感到惊讶:)
2021-05-03 07:41:04
对于任何想知道的人来说,data.Body是原始文件,可以在其他module中使用,例如 graphicsmagick:非常gm(data.Body).identify(function (err, value) {}); 酷!
2021-05-13 07:41:04

我来这里是为了在客户端下载一个 s3 文件。这是我解决它的方法:

因为,我无法在客户端存储我的 s3 身份验证密钥,我使用我的服务器端脚本生成一个预签名的 url 并将其发送回客户端,如:

const AWS = require('aws-sdk')

const s3 = new AWS.S3()
AWS.config.update({accessKeyId: 'your access key', secretAccessKey: 'you secret key'})

const myBucket = 'bucket-name'
const myKey = 'path/to/your/key/file.extension'
const signedUrlExpireSeconds = 60 * 5 // your expiry time in seconds.

const url = s3.getSignedUrl('getObject', {
 Bucket: myBucket,
 Key: myKey,
 Expires: signedUrlExpireSeconds
})

// return the url to client

在前端使用这个网址来触发下载:

function download(url){
    $('<iframe>', { id:'idown', src:url }).hide().appendTo('body').click();
}
$("#downloadButton").click(function(){
    $.ajax({
        url: 'example.com/your_end_point',
        success: function(url){
            download(url);
        }
    })
});
您可以在此处使用 aws 中的 Python 示例阅读更多相关信息:boto3.amazonaws.com/v1/documentation/api/latest/guide/...
2021-05-01 07:41:04
@slh777 我如何使用 axios 下载使用该已签名网址的文件..?有任何想法吗?
2021-05-01 07:41:04
我发现我是否在新选项卡中使用了签名的 url: window.open( signedUrl, '_blank' ); 而不是 iframe,浏览器可以更好地处理下载文件(二进制、图像等)中的混合 mime 类型,否则是一个非常有用的答案。
2021-05-13 07:41:04
签名 URL 究竟是什么?编辑:TIL,advancedweb.hu /2018/10/30/s3_signed_urls
2021-05-15 07:41:04

这里的其他答案有效,但想扩展对我有用的内容。

就我而言,我处理的文件太大了

function download(url){
    $('<iframe>', { id:'idown', src:url }).hide().appendTo('body').click();
}

去工作。(正在获取url is too long)我的解决方案是包含一个隐藏的锚标记,并在 ajax 成功时触发对该标记的点击。除非您不关心处理错误,否则您不能立即使用锚标记。

如果出现问题,S3 将使用 XML 错误文件进行响应,因此浏览器将自动显示该 XML 响应。通过首先尝试使用 ajax 访问 URL,您可以在不显示丑陋 XML 的情况下捕获该错误。在该 ajax 调用成功时,您知道您可以尝试下载文件。