如何通过管道传输 s3 getSignedUrl

How to pipe a s3 getSignedUrl

我正在尝试传输已签名的 url 我存储在 S3 存储桶中的图像。

当使用常规的“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 实现?

找到解决办法了!受这个答案 的启发,我们想要做的是:

  1. 获取要搜索的项目的键。
  2. 将其与参数一起传递给 getSignedUrlPromises。
  3. 从承诺中获取生成的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);
    });
  });

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