node.js - 使用 nodejs、expressjs 和 knox 显示来自 amazon s3 的图像

标签 node.js amazon-s3 knox-amazon-s3-client

我认为这应该是一件直截了当的事情,但我找不到解决方案:s

我正在尝试找出在网站上显示存储在 amazon S3 上的图像的最佳方式。

目前我正在尝试让它工作(不成功)

//app.js
app.get('/test', function (req, res) {
    var file = fs.createWriteStream('slash-s3.jpg');
    client.getFile('guitarists/cAtiPkr.jpg', function(err, res) {
        res.on('data', function(data) { file.write(data); });
        res.on('end', function(chunk) { file.end(); });
    });
});

//index.html
<img src="/test" />

难道不能直接显示来自亚马逊的图片吗? 我的意思是,减轻我的服务器负载的解决方案将是最好的。

最佳答案

这是 streams 的典型用例.你想要做的是:从 Amazon S3 请求一个文件并将这个请求的答案(即图像)直接重定向到客户端,而不存储临时文件。这可以通过使用 .pipe() 来完成。流的函数。

我假设您用来查询 Amazon S3 的库返回一个流,因为您已经使用了 .on('data').on('end') ,这是流对象的标准事件。

这里是你如何做到的:

app.get('/test', function (req, res) {
    client.getFile('guitarists/cAtiPkr.jpg', function(err, imageStream) {
        imageStream.pipe(res);
    });
});

通过使用管道,我们将请求的输出直接重定向到 S3 到客户端。当对 S3 的请求关闭时,这将自动结束 express 的 res

关于流的更多信息,引用substack的优秀Stream Handbook .

PS:请注意,在您的代码片段中,您有两个名为 res 的变量:内部变量将掩盖外部变量,这可能导致难以发现错误。

关于node.js - 使用 nodejs、expressjs 和 knox 显示来自 amazon s3 的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19883561/

相关文章:

javascript - 循环遍历数组以进行 axios 调用

php - 将多个文件上传到 Amazon S3

python - 如何使用 Python 中的线程来并行化 AWS S3 API 调用?

node.js - 使用 knox 上传时在非对象上调用的 TypeError : Object. 键

node.js - 在 node.js 中创建 S3 签名 URL

node.js - 无法在 Nodejs 的 mongoose 中使用聚合

node.js 快速资源自动加载不起作用

javascript - Meteor Fiber 在诺克斯中出现回调问题

javascript - 将 RequireJS 主要优化文件作为 NGINX 的静态 Assets 提供

javascript - AWS S3 直接上传并自动公开文件