node.js - gm Error in aws lambda: string yields empty buffer -


i'm trying upload buffer s3 after doing auto-orient transformation using amazon lambda. i'm sending buffer nodejs api so:

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

when console log data.file._data in api so:

  _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 ... >, 

in lambda (also nodejs) have code:

// 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');    // reference 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 image type.      var typematch = filename.match(/\.([^.]*)$/);      if (!typematch) {          console.error('unable infer image type 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 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 image folder.              s3.putobject({                  bucket: bucket,                  key: mediaid + "/" + filename,                  body: data,                  contenttype: imagetype.touppercase()              }, next);          }          ], function(err, result) {              if (err) {                  console.error(err);              }              // return data api here              context.done();          }      )// end async waterfall  }// end exports handler

so. when try upload image file._data prints before gm command:

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

but within gm command prints err:

error: stream yields empty buffer

found out issue-

data passed in aws lambda had remade buffer object accepted gm. changed 1 line of code (inside exports.handler, i'm defining file)

// 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');    // reference 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 image type.      var typematch = filename.match(/\.([^.]*)$/);      if (!typematch) {          console.error('unable infer image type 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 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 image folder.              s3.putobject({                  bucket: bucket,                  key: mediaid + "/" + filename,                  body: data,                  contenttype: imagetype.touppercase()              }, next);          }          ], function(err, result) {              if (err) {                  console.error(err);              }              // return data api here              context.done();          }      )// end async waterfall  }// end exports handler


Comments

Popular posts from this blog

sequelize.js - Sequelize group by with association includes id -

android - Robolectric "INTERNET permission is required" -

java - Android raising EPERM (Operation not permitted) when attempting to send UDP packet after network connection -