奇怪的node.js + http + gm + s3行为

时间:2017-01-27 20:57:43

标签: node.js gm aws-sdk-nodejs

此node.js代码块的目的是下载图像,调整大小,将调整大小的图像上传到s3,然后将原始图像上传到s3。

非工作代码:

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    let attributesForElementsInRect = super.layoutAttributesForElements(in: rect)
    var newAttributesForElementsInRect = [UICollectionViewLayoutAttributes]()
    // use a value to keep track of left margin
    var leftMargin: CGFloat = 0.0;
    for attributes in attributesForElementsInRect! {
        let refAttributes = attributes 
        // assign value if next row
        if (refAttributes.frame.origin.x == self.sectionInset.left) {
            leftMargin = self.sectionInset.left
        } else {
            // set x position of attributes to current margin
            var newLeftAlignedFrame = refAttributes.frame
            newLeftAlignedFrame.origin.x = leftMargin
            refAttributes.frame = newLeftAlignedFrame
        }
        // calculate new value for current margin
        leftMargin += refAttributes.frame.size.width + 10
        newAttributesForElementsInRect.append(refAttributes)
    }

    return newAttributesForElementsInRect
}

问题是此代码块未按预期运行。在上面的代码中,s3上传的缩略图始终是空文件。

但是,如果删除第二个s3上传请求,缩略图会神奇地开始正确上传。

工作代码:

http.get(url, function onResponse(res) {
    gm(res)
    .resize(250,250)
    .stream(function(err, stdout, stderr){
        if(debug)console.log("Resized "+key+" and created "+key+"_thumb.jpg");
        if(err){
                console.log("Error resizing image. Message:",err);
        }
        else{
            var data = {
                Bucket: 'bucket-name',
                Key: key+"_thumb.jpg",
                Body: stdout,
                ACL: "public-read",
                ContentType:"image/jpeg"
            };
            s3 = new aws.S3()
            s3.upload(data, function(err, resp) {
                if(debug)console.log(resp);
            });
            s3=null;
            stdout=null;
            data=null;
        }
    });                        
    s3 = new aws.S3()
    s3.upload({Bucket:"bucket-name", Key: key+".jpg", ACL:"public-read", ContentType:"image/jpeg" ,Body: res}, function(err,data){
        if(debug)console.log(data);
        data=null;
    });
    s3=null;
    res=null;
});

为什么我可以在第二个示例中上传缩略图,而不是第一个?

1 个答案:

答案 0 :(得分:1)

我明白了。

成功完成http.get后,我使用以下代码创建一个可重用的缓冲区。

res.on('data', function(chunk) {
    data.push(chunk);
}).on('end', function() {
    var imgbuffer = Buffer.concat(data);
    //create thumbnail
    //s3.upload thumbnail
    //s3.upload original
});