节点js - 将文件从Amazon Lambda中的/ tmp移动到s3bucket

时间:2016-08-25 10:07:41

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

我正在尝试在亚马逊lambda中编写一个简单的截图程序,它将采用以下JSON格式的给定网址的屏幕抓图:

{
  "site": "www.google.com",
  "width": "320",
  "height": "480"
}

我的lambda函数的代码如下:

'use strict';

var AWS = require('aws-sdk');
var fs = require('fs');
var webshot = require('webshot');
var request = require('request');

var s3bucket = '<bucket-name>';
exports.handler = function(event, context, callback) {
  console.log( "Attempting to screenshot:", event.site);

  var parts = event.site.split('?'),
      base64Key = new Buffer(parts[0].toLowerCase()).toString('base64').replace(/\//g, '|').replace(/\+/g, '$') + '.png',
      options = {
        shotSize: {
          width: event.width,
          height: event.height
        }
      },
      s3 = new AWS.S3(),
      renderStream = webshot(event.site, options),
      file = fs.createWriteStream('/tmp/' + base64Key, {encoding: 'binary'}),
      bin = '';

  renderStream.on('data', function(data) {
    // bin += data.toString('binary');
    file.write(data.toString('binary'), 'binary');
  });

  renderStream.on('end', function() {
    // var options = {
    //    Bucket: s3bucket,
    //    Key: base64Key,
    //    ACL: 'public-read',
    //    body: file
    // };
    // s3.putObject(options, function(err, data) {
    //     if(err) {
    //       callback(err);
    //     } else {
    //       callback(null, 'Image uploaded to Amazon s3 bucket: ' + s3bucket);
    //     }
    // });


    var buffer = new Buffer(bin);
    s3.putObject({
        Bucket: s3bucket,
        Key: base64Key,
        ACL: 'public-read',
        Body: buffer.toString('binary')
    }, function(err, data) {
       if(err) {
         callback(err);
       } else {
         callback(null, 'Image uploaded to Amazon s3 bucket: ' + s3bucket);
       }
    });
  });
}

我的问题是:

当我将文件写入/ tmp目录时,它按预期存在,但是,当我尝试将图像从/ tmp目录上传到我的s3存储桶时,它无法正常工作。

我尝试上传原始数据(bin),也在上面已注释的缓冲区内。我也尝试直接上传文件流,虽然这些尝试都不起作用。

在amazon上运行时,日志文件没有显示任何错误。我查看了putObject上的Docs,但我似乎无法看到我出错的地方。

对此的任何帮助将不胜感激。

更新

问题似乎是文件是在/ tmp中创建的,但是没有数据写入它,因此当它被复制到S3时,会有一个大小为0字节的.png文件

1 个答案:

答案 0 :(得分:3)

试试这个

'use strict';
exports.handler = function(event, context, callback) {

var AWS = require('aws-sdk');
var fs = require('fs');
var webshot = require('webshot');
var request = require('request');
var s3bucket = '<bucket-name>';

console.log( "Attempting to screenshot:", event.site);

  var parts = event.site.split('?'),
      base64Key = new Buffer(parts[0].toLowerCase()).toString('base64').replace(/\//g, '|').replace(/\+/g, '$') + '.png',
      options = {
        shotSize: {
          width: event.width,
          height: event.height
        }
      },
      s3 = new AWS.S3(),
      renderStream = webshot(event.site, options),
      file = fs.createWriteStream('/tmp/' + base64Key, {encoding: 'binary'}),
      bin = '';

  renderStream.on('data', function(data) {
    // bin += data.toString('binary');
    file.write(data.toString('binary'), 'binary');
  });

  renderStream.on('end', function() {

        fs.readFile(path, function (err, file_buffer) {

            var params = {
                Bucket: s3bucket,
                Key: 'base64Key',
                Body: file_buffer
            };

            s3.putObject(params, function (err, pres) {
                if (err) {
                   callback(err);
                } else {
                      callback(null, 'Image uploaded to Amazon s3 bucket: ' + s3bucket);
                }
            });
        });
  });
}