gpt4 book ai didi

node.js - 使用 Node.js 和 Amazon S3 将文件直接传送到客户端

转载 作者:太空宇宙 更新时间:2023-11-04 00:03:34 25 4
gpt4 key购买 nike

所以我想将文件直接通过管道传送给客户端;我目前的做法是创建一个文件到磁盘,然后将该文件直接发送到客户端。

router.get("/download/:name", async (req, res) => {

const s3 = new aws.S3();
const dir = "uploads/" + req.params.name + ".apkg"
let file = fs.createWriteStream(dir);

await s3.getObject({
Bucket: <bucket-name>,
Key: req.params.name + ".apkg"
}).createReadStream().pipe(file);

await res.download(dir);
});

我刚刚查了一下 res.download() 仅在本地提供服务。有没有办法可以直接从AWS S3到客户端下载?即直接将文件传送给用户。提前致谢

最佳答案

this SO thread 中所述:
您可以简单地将读取流传输到响应中,而不是将其传输到文件中,只需确保提供正确的 Content-Type 并将其设置为附件,以便浏览器知道如何正确处理响应。

res.attachment(req.params.name);
await s3.getObject({
Bucket: <bucket-name>,
Key: req.params.name + ".apkg"
}).createReadStream().pipe(res);

更多模式是直接创建一个指向 S3 对象的签名 URL,然后让客户端直接从 S3 下载,而不是从 Node Web 服务器流式传输。这将减少网络服务器的工作负载。

您将需要使用getSignedUrl来自适用于 JS 的 AWS S3 开发工具包的方法。
然后,一旦获得 URL,只需将其返回给客户端即可自行下载文件。

您应该考虑到,一旦您为客户端提供了具有下载权限(例如 5 分钟)的签名 URL,他们将只能在接下来的 5 分钟内下载该文件。您还应该考虑到,他们可以在这 5 分钟内将该 URL 传递给其他任何人进行下载,因此这取决于您需要的安全程度。

关于node.js - 使用 Node.js 和 Amazon S3 将文件直接传送到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53454122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com