【问题标题】:showing an image from amazon s3 with nodejs, expressjs and knox使用 nodejs、expressjs 和 knox 显示来自 amazon s3 的图像
【发布时间】:2013-11-21 21:49:29
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    这是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

    有关流的更多信息,请参阅子栈的优秀Stream Handbook

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

    【讨论】:

    • 您的服务器发出实际请求,但它不会将结果存储到文件中,而是直接将输出写入客户端的套接字。这是非常有效的,并且可以进行巧妙的优化,请参阅流手册以了解核心流机制的概述。
    • 如何在流式传输多个图像时应用此方法?例如,将许多图像流式传输到用户的新提要(如 Facebook)。
    【解决方案2】:

    如果您正确设置了访问控制(基于每个密钥。而不是整个存储桶。)那么您可以使用 &lt;img src="http://aws.amazon.com/myBucket/myKey/moreKey.jpg"&gt;(如果您使用的是 us-east- 以外的其他内容,则可以使用另一个适当的域1)无论您想在html中显示图像的任何位置。如果您希望浏览器显示图像而不是在有人打开图像时将图像下载为附件,请记住设置 MIME 类型。

    aws-sdk docs
    s3: PUT Object docs

    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);
    });
    

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 2013-10-05
      • 2015-04-26
      • 2020-08-10
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      相关资源
      最近更新 更多