node.js - Node js - 将文件从 Amazon Lambda 中的/tmp 移动到 s3bucket

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

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

{
  "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),并且也在上面注释掉的缓冲区内。我也尝试过直接上传文件流,但这些尝试都没有奏效。

在亚马逊上运行时,日志文件没有显示任何错误。我浏览了 Docs在 putObject 上,尽管我似乎看不出哪里出错了。

如有任何帮助,我们将不胜感激。

更新

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

最佳答案

试试这个

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

关于node.js - Node js - 将文件从 Amazon Lambda 中的/tmp 移动到 s3bucket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39142352/

相关文章:

node.js - 在 Cloud Functions for Firebase 中将对象从一个 Node 复制到另一个 Node

ruby-on-rails - 是否可以配置 Paperclip 为 S3 生成 HTTPS url?

php - Amazon S3 和 jqueryfileupload 插件的图像上传性能问题

scala - 读取 s3 存储桶时出错

javascript - 为 HTTP 响应在 Node.JS 中迭代对象

javascript - 回调基础知识

javascript - 我如何用 Jest 来模拟异步提取?

amazon-web-services - 将角色/用户添加到 AWS 服务目录组合

amazon-web-services - 在AWS-ECS Docker容器上扩展根分区

java - 通过 EC2 标签解析特定值