aws lambda如何存储在S3中通过https检索的图像

kle*_*ver 4 amazon-s3 node.js aws-sdk aws-lambda

我正在尝试编写一个lambda脚本,可以从站点中提取图像并将其存储在S3中.我遇到的问题是什么样的对象作为Body属性传递给S3.putObject方法.在这里的文档中它说它应该是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);
      }
    });
  });
};
Run Code Online (Sandbox Code Playgroud)

Ale*_*N-o 5

如评论中所示,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);
        }
      });
    });
  });
};
Run Code Online (Sandbox Code Playgroud)