gm aws lambda中的错误:string产生空的缓冲区

我尝试使用亚马逊lambda进行自动定位转换后上传一个缓冲区到s3。 我从一个Nodejs api发送缓冲区如下所示:

var data = request.payload; if (data.file) { var Media = request.server.plugins.dogwater.media; var name = data.file.hapi.filename; var local_path = "./uploads/" + name; var file = fs.createWriteStream(local_path); console.log('adding media...') file.on('error', function(err) { console.error(err) }); data.file.pipe(file); data.file.on('end', function(err) { var pic = { gallery_id: request.params.gallery_id, type: 1 }; console.log("\n\n\ndata.file = ",data.file) Media.create(pic) .then(function(media) { httpRequest({ url: 'secret', method: 'POST', json: { media_id: media._id, file_name: data.file.hapi.filename, bucket: 'secret', file: data.file }, headers: { 'x-api-key': 'someapikey' } 

当我在API中控制日志data.file._data我得到如下所示:

  _data: <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 00 48 00 00 ff e2 0b f8 49 43 43 5f 50 52 4f 46 49 4c 45 00 01 01 00 00 0b e8 00 00 00 00 02 00 00 00 ... >, 

在lambda(也是nodejs)我有这样的代码:

 // dependencies var async = require('async'); var AWS = require('aws-sdk'); var gm = require('gm').subClass({ imageMagick: true }); var util = require('util'); var path = require('path'); // get reference to S3 client var s3 = new AWS.S3(); exports.handler = function(event, context) { // payload data var mediaId = event.media_id; var filename = event.file_name; var bucket = event.bucket; var file = event.file._data; console.log("file = ",file); // Infer the image type. var typeMatch = filename.match(/\.([^.]*)$/); if (!typeMatch) { console.error('unable to infer image type for file ' + filename); return; } var imageType = typeMatch[1].toLowerCase(); var acceptedTypes = ['jpg','gif','png','eps','jpeg']; if (acceptedTypes.indexOf(imageType)===-1) { console.log('skipping non-image '); return; } async.waterfall([ function process(next) { // Transform the image buffer in memory. gm(file).autoOrient().toBuffer( imageType.toUpperCase(), function(err, buffer) { if (err) { //newly added line below: console.log(err); console.log("hit"); next(err); } else { console.log("buffer = ",buffer); next(null,buffer); } } ); }, function upload(data, next) { // Stream the image to folder. s3.putObject({ Bucket: bucket, Key: mediaId + "/" + filename, Body: data, ContentType: imageType.toUpperCase() }, next); } ], function(err, result) { if (err) { console.error(err); } // return data to api here context.done(); } )// end async waterfall }// end exports handler 

所以。 当我尝试上传一个图像时,这是什么file._data打印像以前的gm命令:

  {type:'Buffer',data:[234,234,234,random numbers etc ...]} 

但是在gm命令中,这会打印为err:

错误:stream产生空的缓冲区

发现问题 –

传入aws lambda的数据必须重新映射到gm接受的缓冲区对象。 更改了一行代码(内部exports.handler,我正在定义文件)

 // dependencies var async = require('async'); var AWS = require('aws-sdk'); var gm = require('gm').subClass({ imageMagick: true }); var util = require('util'); var path = require('path'); // get reference to S3 client var s3 = new AWS.S3(); exports.handler = function(event, context) { // payload data var mediaId = event.media_id; var filename = event.file_name; var bucket = event.bucket; var file = new Buffer(event.file._data); console.log("file = ",file); // Infer the image type. var typeMatch = filename.match(/\.([^.]*)$/); if (!typeMatch) { console.error('unable to infer image type for file ' + filename); return; } var imageType = typeMatch[1].toLowerCase(); var acceptedTypes = ['jpg','gif','png','eps','jpeg']; if (acceptedTypes.indexOf(imageType)===-1) { console.log('skipping non-image '); return; } async.waterfall([ function process(next) { // Transform the image buffer in memory. gm(file).autoOrient().toBuffer( imageType.toUpperCase(), function(err, buffer) { if (err) { //newly added line below: console.log(err); console.log("hit"); next(err); } else { console.log("buffer = ",buffer); next(null,buffer); //next(null, 'done'); } } ); }, function upload(data, next) { // Stream the image to folder. s3.putObject({ Bucket: bucket, Key: mediaId + "/" + filename, Body: data, ContentType: imageType.toUpperCase() }, next); } ], function(err, result) { if (err) { console.error(err); } // return data to api here context.done(); } )// end async waterfall }// end exports handler