通过API网关上传带有S3的nodejs Lambda

时间:2018-09-09 21:39:32

标签: node.js amazon-web-services amazon-s3

我一直在尝试获得一个简单的无服务器API网关-> NodeJS Lambda-> S3,但是Lambda似乎只是在上传损坏的文件。

此代码将从URL下载文件,然后直接上传到S3。 我尝试了putObject和upload(具有不同的参数)都没有成功。当我下载原始文件时,文件大小为24KB,从S3下载的(损坏的)映像文件为44KB。

我只是通过对API网关URL进行POST来测试应用程序。

有什么想法吗?

var url =
  "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/AmazonWebservices_Logo.svg/500px-AmazonWebservices_Logo.svg.png"
module.exports.upload = function(event, context, callback) {
  https.get(url, function(res) {
    var body = ""
    res.on("data", function(chunk) {
      // Agregates chunks
      body += chunk
    })
    res.on("end", function() {
      console.log(body)

      // Once you received all chunks, send to S3 - putObject only
      var params = {
        Bucket: S3_BUCKET_NAME,
        Key: "aws-logo.png",
        Body: body
      }

      var s3Params = {
        Bucket: S3_BUCKET_NAME,
        Key: "aws-logo-upload.png",
        Body: body,
        ContentType: "image/png"
      }

      s3.upload(s3Params, function(err, data) {
        // s3.putObject(params, function(err, data) {
        if (err) {
          console.log("error")
          console.error(err, err.stack)
          callback(null, { statusCode: 404, error })
        } else {
          console.log("ok")
          console.log(data)
          let response = {
            statusCode: 200
          }
          callback(null, response)
        }
      })
    })
  })
}

1 个答案:

答案 0 :(得分:0)

以下代码对我而言适用于API Gateway / Lambda。它会在S3中生成一个PNG,可以将其下载为有效的23.7 KB图像。我希望在Lambda中也能使用。

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

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

const getThenUpload = (url, callback) => {
  https.get(url, (res) => {
    const data = [];

    res.on('data', (chunk) => {
      data.push(chunk);
    });

    res.on('end', () => {
      const params = {
        Bucket: S3_BUCKET_NAME,
        Key: 'aws-logo-upload.png',
        Body: Buffer.concat(data),
        ContentType: 'image/png',
      };

      s3.upload(params, (err, rsp) => {
        if (err) {
          console.error(err, err.stack);
          callback(err, { statusCode: 404, err });
        } else {
          console.log(rsp);
          callback(null, { statusCode: 200 });
        }
      });
    });
  });
};

getThenUpload(logourl, (err, data) => {
  if (err) {
    console.error(`Error: ${err}`);
  } else {
    console.log(`Data: ${JSON.stringify(data)}`);
  }
});