我正试图通过管道传输S3中存储在bucket中的图像的签名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实现这一点?
找到了解决方案!受到这个答案的启发https://stackoverflow.com/a/65976684/4179240在高层,我们想做的是:
- 获取要搜索的项目的密钥
- 将其与params一起传递给getSignedUrlPromises
- 从promise中获取生成的url
- 通过管道从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);
});
});
如果你找到更好的方法,请告诉我!😃