Node.js 显示来自AmazonS3的带有nodejs、expressjs和knox的图像
我认为这应该是一件直截了当的事情,但我找不到解决办法:s 我正试图找出在网站上显示存储在AmazonS3上的图像的最佳方式 目前我正在尝试让它工作(不成功)Node.js 显示来自AmazonS3的带有nodejs、expressjs和knox的图像,node.js,amazon-s3,knox-amazon-s3-client,Node.js,Amazon S3,Knox Amazon S3 Client,我认为这应该是一件直截了当的事情,但我找不到解决办法:s 我正试图找出在网站上显示存储在AmazonS3上的图像的最佳方式 目前我正在尝试让它工作(不成功) //app.js app.get('/test',函数(req,res){ var file=fs.createWriteStream('slash-s3.jpg'); client.getFile('guitarists/cAtiPkr.jpg',函数(err,res){ res.on('data',function(data){file
//app.js
app.get('/test',函数(req,res){
var file=fs.createWriteStream('slash-s3.jpg');
client.getFile('guitarists/cAtiPkr.jpg',函数(err,res){
res.on('data',function(data){file.write(data);});
res.on('end',函数(chunk){file.end();});
});
});
//index.html
难道不可能直接从amazon上显示图像吗?
我的意思是,减轻服务器负载的解决方案是最好的。这是一个典型的应用案例。您要做的是:从AmazonS3请求一个文件,并将该请求的答案(即图像)直接重定向到客户端,而不存储临时文件。这可以通过使用流的函数来实现 我假设您用来查询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的“优秀”
注意,在您的代码片段中有两个名为
res
的变量:内部变量将掩盖外部变量,这可能导致难以发现的错误。如果您正确设置访问控制(基于每个键,而不是整个存储桶),那么您可以使用
(如果您使用的不是us-east-1,则为另一个适当的域)如果您希望在html中显示图像,请记住,如果您希望浏览器显示图像,而不是在有人打开图像时将其作为附件下载,请设置MIME类型
您的服务器发出实际请求,但它不会将结果存储到文件中,而是直接将输出写入客户端的套接字。这非常有效,并允许进行整洁的优化。有关核心流机制的概述,请参阅流手册。在流式处理多个图像时如何应用此方法?有关详细信息,请参阅站姿,将许多图像流式传输到用户的新feed上,如Facebook。
app.get('/test', function (req, res) {
client.getFile('guitarists/cAtiPkr.jpg', function(err, imageStream) {
imageStream.pipe(res);
});
});
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);
});