1

这个 node.js 代码块的目的是下载一张图片,调整它的大小,将调整大小的图片上传到 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;
});

问题是这个代码块没有按预期运行。在上面的代码中,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;
        }
    });                        
    res=null;
});

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

4

1 回答 1

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
});
于 2017-01-27T22:10:57.160 回答