Javascript NodeJS从AWS S3 Bucket下载文件

Javascript NodeJS从AWS S3 Bucket下载文件,javascript,node.js,amazon-web-services,express,amazon-s3,Javascript,Node.js,Amazon Web Services,Express,Amazon S3,我试图在NodeJS/Express中创建一个端点,用于从AWS S3存储桶下载内容 它工作得很好,我可以在客户端下载文件,但我也可以在网络选项卡中看到流预览,这很烦人 问题 我想知道我所做的是否正确,是否是一种良好的做法。 还想知道在网络选项卡中看到输出流是否正常 如何使用NodeJS/Express将I文件从S3正确地发送到客户端应用程序 我敢肯定其他网站的请求不会让你预览带有“加载响应数据失败”字样的内容 这是我在NodeJS应用程序中从AWS S3获取流文件的步骤: 下载(fileI

我试图在NodeJS/Express中创建一个端点,用于从AWS S3存储桶下载内容

它工作得很好,我可以在客户端下载文件,但我也可以在网络选项卡中看到流预览,这很烦人

问题

我想知道我所做的是否正确,是否是一种良好的做法。 还想知道在网络选项卡中看到输出流是否正常

如何使用NodeJS/Express将I文件从S3正确地发送到客户端应用程序

我敢肯定其他网站的请求不会让你预览带有“加载响应数据失败”字样的内容


这是我在NodeJS应用程序中从AWS S3获取流文件的步骤:

下载(fileId){
const fileObjectStream=app.s3
.getObject({
关键字:fileId
})
.createReadStream();
此.res.set(“内容类型”、“应用程序/八位字节流”);
这是一套(
“内容处置”,
'附件;filename=“”+fileId+”'
);
fileObjectStream.pipe(this.res);

}
我认为问题在于标题:

          //this line will set proper header for file and make it downloadable in client's browser

          res.attachment(key); 

          // this will execute download 
          s3.getObject(bucketParams)
          .createReadStream()
          .pipe(res);
所以代码应该是这样的(这是我在项目处理文件中以res.attachment或res.json的形式执行的,以防出现错误,这样客户端可以向最终用户显示错误):


我想另一种选择是让NodeJ创建一个签名url,然后将其发送到客户端。然后,客户端可以使用该签名url访问S3内容。这如何触发客户端的下载呢?在客户端,触发文件的是正确的头。在常规HTTP响应中,Content Disposition response标头是一个标头,指示内容是否应在浏览器中内联显示,即作为网页或网页的一部分,或作为本地下载和保存的附件显示。例如内容配置:附件;filename=“whateverIfFileName.jpg”将向浏览器发送下载文件的指示。。。。在我上面的代码中,res.attachment(key)设置了正确的文件头,以便通过浏览器下载文件。我希望这有帮助。
router.route("/downloadFile").get((req, res) => {
      const query = req.query; //param from client
      const key = query.key;//param from client
      const bucketName = query.bucket//param from client

      var bucketParams = {
        Bucket: bucketName,  
        Key: key
      };

      //I assume you are using AWS SDK
      s3 = new AWS.S3({ apiVersion: "2006-03-01" });

      s3.getObject(bucketParams, function(err, data) {
        if (err) {
          // cannot get file, err = AWS error response, 
          // return json to client
          return res.json({
            success: false,
            error: err
          });
        } else {
          res.attachment(key); //sets correct header (fixes your issue ) 
          //if all is fine, bucket and file exist, it will return file to client
          s3.getObject(bucketParams)
            .createReadStream()
            .pipe(res);
        }
      });
    });