【问题标题】:How to pipe a s3 getSignedUrl如何通过管道传输 s3 getSignedUrl
【发布时间】:2021-12-29 20:40:21
【问题描述】:

我正在尝试通过管道传输存储在 S3 存储桶中的图像的签名 URL。

当使用常规的“getObject”方法时,我可以这样做

  app.get("/images/:key", (req, res) => {

    const key = req.params.key;
    const downloadParams = {
    Key: key,
    Bucket: bucketName,
  };
    const readStream = s3.getObject(downloadParams).createReadStream();
    readStream.pipe(res);

  });

但是当我尝试使用 getSignedUrlPromise 时,我不能使用 createReadStream 方法,因为它说它不是一个函数。

 const readStreamSigned = await s3
   .getSignedUrlPromise("getObject", downloadParams).createdReadStream // throws createReadStream is not a function

readStreamSigned.pipe(res)

如何使用 getSignedUrl 或 getSignedUrlPromise 实现这一目标?

【问题讨论】:

  • getSignedUrlPromise 返回一个字符串,只需将该字符串返回给客户端即可。
  • 这个想法是,当导航到 api 链接时,浏览器会为您呈现图像,将字符串返回给客户端只会给他们以文本形式的 url
  • “常规 getObject”会发生什么?
  • 我的要求是使用预签名的网址

标签: node.js amazon-s3 signed-url


【解决方案1】:

找到了解决办法!受到这个答案https://stackoverflow.com/a/65976684/4179240 的启发,我们想要做的是:

  1. 获取要搜索的项目的键。
  2. 将其与参数一起传递给 getSignedUrlPromises。
  3. 从promise中获取生成的url。
  4. 从 get() 的回调中传递结果。

我最终是这样做的

  app.get("/images/:key", async (req, res) => {
    const key = req.params.key;

    const downloadParams = {
      Key: key,
      Bucket: bucketName,
    };

    const url = await s3.getSignedUrlPromise("getObject", downloadParams);

    https.get(readStream, (stream) => {
      stream.pipe(res);
    });
  });

如果您找到更好的方法,请告诉我! ?

【讨论】:

    猜你喜欢
    • 2016-09-17
    • 2019-01-27
    • 1970-01-01
    • 2021-12-27
    • 2019-10-26
    • 2017-07-18
    • 2016-06-14
    • 1970-01-01
    相关资源
    最近更新 更多