从节点中的S3下载并在新窗口中打开

时间:2016-11-03 16:40:24

标签: angularjs node.js amazon-s3

My Angular 1应用程序将文件保存到S3并允许各种文件类型。

当我检索对象时,我使用以下代码:

export function show(req, res) { 
    const s3 = new aws.S3();
      const s3Params = {
        Bucket: S3_BUCKET,
        Key: req.query.key + ''
      };
      res.attachment(req.query.key + '');
      var fileStream = s3.getObject(s3Params).createReadStream();
      fileStream.pipe(res);
}

我想在新窗口中打开客户端上收到的文件(就像在AWS控制台上一样),但我无法弄清楚如何去做。

例如,客户端根本不起作用:

 .then(
    (data) => {
      var file = new Blob([data], {type: 'application/pdf'});
      var fileURL = URL.createObjectURL(file);
      window.open(fileURL);
    }
  )

我真的不明白数据流的概念是如何工作的。

2 个答案:

答案 0 :(得分:1)

如果您不必下载pdf,可以直接从s3打开它。

s3client.getResourceUrl("your-bucket", "some-path/some-key.jpg");

这会将url返回给该文件。 所以你需要像:

这样的代码

export function show(req, res) {
  this.s3client = new aws.S3({
    accessKeyId: options.accessKeyId,
    secretAccessKey: options.secretAccessKey,
    region: options.region
  })
  let resourceUrl = s3client.getResourceUrl(S3_BUCKET, req.query.key + '');
  window.open(resourceUrl, '_blank');
}

对不起,现在无法测试,但试试看。应该工作。

答案 1 :(得分:0)

我所要做的就是获得一个signedUrl资源,使其比我想做的更简单。

export function show(req, res) {
  const s3 = new aws.S3();
  const s3Params = {
    Bucket: S3_BUCKET,
    Key: req.query.key + ''
  };
  s3.getSignedUrl('getObject', s3Params, (err, data) => {
    if (err) {
      console.log(err);
      return res.end();
    }
    const returnData = {
        signedRequest: data,
    };
    res.write(JSON.stringify(returnData));
    res.end();
  });
}

在客户端上我所要做的就是在新标签页中打开链接:

openDoc(doc) {
this.$http()
  .then(
    (data) => {
      this.$window.open(data.data.signedRequest, '_blank')
    }
  )
  .catch(
    (err) => {
      this.Notification.error('failed to download attachment');
    }
  )
 }