我认为这应该是一件直截了当的事情,但我找不到解决方案: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/