2017年2月1日水曜日

lambdaでgmを使ってリサイズとかをするときに、「Stream yields empty buffer」が出てしまうのはtoBufferが原因だよ的なお話

lambdaはちょっとした作業をするのにすごく便利なもののわけで。
特にAPI Gatewayと組み合わせ、CORSもさせるとそれはもう大体のことはクライアントサイドでできるわけで。
けどまぁ色々なことを考慮すると普通にサーバサイドを使う方が早いんだけども。

ただそんなことは言わず、とりあえず画像加工をlambdaに任せようかと。
で、そのときにgmを使うわけなんだけども「Stream yields empty buffer」というエラーがでてしまった。
ということで今日はそれを解決するには的なお話をば。

結論から言うと、toBufferが原因で「Stream yields empty buffer lambda gm」が出ていた
ということでこれを使わずに違う方法で書き出すには、streamを使いましょう的な。

gm(imageBuffer.data).size(function(err,size){
var w = 1200;
var h = 630;
if(err){
console.log("gm error")
context.fail(err);
}
this.background("#ffffff").resize(w,h).gravity("Center").extent(w,h).stream(function(err,stdout,stderr){
if(err){
console.log("gm process error");
console.log(err,stdout,stderr)
context.fail(err);
}
var chunks = [];
stdout.on('data',function(chunk){
chunks.push(chunk);
});
stdout.on('end',function(){
var buffer = Buffer.concat(chunks);
var params = {
Bucket: BUCKET_NAME,
Key: "hoge/hoge.png",
ACL: 'public-read',
ContentType: imageBuffer.type,
Body: buffer
};
s3.putObject(params, function(err, data) {
if(err){
console.log("gm upload error");
context.fail(err);
}
context.succeed({
"error":false
});
});
});
stderr.on('data',function(data){
console.log(`stderr ${size} data:`, data);
})
});
});

面倒だから諸々省略しているけど、gm部分はこのような感じになる。

lambdaは便利なんだけど、たまにこういうことがあるわけで。
なので他の方法もちゃんと使えるようにしておきましょう的なみたいな。

0 件のコメント:

コメントを投稿

Pages (26)1234567 Next

Adsense