【问题标题】:aws lambda how to store an image retrieved via https in S3aws lambda如何在S3中存储通过https检索的图像
【发布时间】:2016-09-12 23:19:40
【问题描述】:

我正在尝试编写一个 lambda 脚本,该脚本可以从站点中提取图像并将其存储在 S3 中。我遇到的问题是将什么样的对象作为 Body 属性传递给S3.putObject 方法。在文档here 中说它应该是new Buffer('...') || 'STRING_VALUE' || streamObject,但我不确定如何将https 响应转换为其中之一。这是我尝试过的:

var AWS = require('aws-sdk');
var https = require('https');
var Readable = require('stream').Readable;
var s3 = new AWS.S3();
var fs = require('fs');

var url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/AmazonWebservices_Logo.svg/500px-AmazonWebservices_Logo.svg.png';

exports.handler = function(event, context) {
  https.get(url, function(response) {
    var params = {
     Bucket: 'example',
     Key: 'aws-logo.png',
     Body: response  // fs.createReadStream(response); doesn't work, arg should be a path to a file...
                     // just putting response errors out with "Cannot determine length of [object Object]"
    };

    s3.putObject(params, function(err, data) {
      if (err) {
        console.error(err, err.stack);
      } else {
        console.log(data);
      }
    });
  });
};

【问题讨论】:

  • 如果我没记错的话,在该示例中,脚本似乎在本地计算机上运行,​​他们使用 curl 将文件保存到磁盘,然后使用该保存文件的路径。由于我在 lambda 我无法将文件保存到磁盘
  • “由于我使用 lambda,我无法将文件保存到磁盘”。这是不正确的。您在 Lambda 上有可用的磁盘空间来临时存储文件。

标签: node.js amazon-s3 aws-sdk aws-lambda


【解决方案1】:

如 cmets 所示,Lambda 允许将文件保存在 /tmp 中。但你真的不需要它......

response 不包含文件的内容,但包含 http 响应(及其状态代码和标头)。

你可以试试这样的:

var AWS = require('aws-sdk');
var https = require('https');
var s3 = new AWS.S3();

var url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/AmazonWebservices_Logo.svg/500px-AmazonWebservices_Logo.svg.png';

exports.handler = function(event, context) {
  https.get(url, function(res) {
    var body = '';
    res.on('data', function(chunk) {
      // Agregates chunks
      body += chunk;
    });
    res.on('end', function() {
      // Once you received all chunks, send to S3
      var params = {
        Bucket: 'example',
        Key: 'aws-logo.png',
        Body: body
      };
      s3.putObject(params, function(err, data) {
        if (err) {
          console.error(err, err.stack);
        } else {
          console.log(data);
        }
      });
    });
  });
};

【讨论】:

  • 只是为了记录“s3”在这里未定义,我不得不添加:var s3 = new AWS.S3();
  • 知道将图像传输到 s3 会消耗多少 s3 资源(除了存储空间)。会产生多少看跌期权以及其他费用?
【解决方案2】:

试试这个包https://www.npmjs.com/package/request

var request = require('request');

exports.handler = function (event, context) {
   s3.putObject({
       Bucket: 'example',
       Key: 'aws-logo.png',
       Body: request.get(url, {followRedirect: false})
   }, function (err, data) {
       if (err)  console.error(err, err.stack);
       else console.log(data);
   })
}

【讨论】:

  • 这可以正常工作,但是request 模块不在核心节点中,所以我选择了@alexis-n-o 答案,因为它不需要加载那个额外的模块
猜你喜欢
  • 1970-01-01
  • 2015-04-30
  • 2020-02-21
  • 2021-02-22
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多