在NodeJS中调整大小并上传图像流

时间:2012-04-29 04:40:25

标签: node.js

所有

我有一系列尺寸,例如尺寸= [20,40,60,80]

我需要遍历这些,将src图像的大小调整为每个大小并正确命名。

然后,使用knox将它们上传到s3,然后删除已调整大小的图像。

这就是我所拥有的:

http://jsfiddle.net/bpoppa/ZAcA7/

问题是流量控制。当knox尝试putFile时,我得到一个错误,说它不存在,这意味着knox在调整大小之前运行或者在此时已经删除。

任何提示?感谢所有帮助。

谢谢!

1 个答案:

答案 0 :(得分:3)

您需要记住node.js代码是异步运行的。在原始代码中,knox代码在image.resize完成之前运行(回调用于告诉您操作何时完成,而不仅仅是处理错误)。 Node不会等待回调,只是继续在你的函数中执行代码。您还需要注意在for循环中使用匿名回调而不创建闭包。

通常,您希望使用回调来控制程序流,如下面的代码所示,这样您只有在前面的操作完成后才会执行以下操作。

var src = name + '.jpg';

for (var i = sizes.length - 1; i >= 0; i--) {
    var k = i;

    var dest = sizes[k] + '.jpg';
    var s3   = sizes[k] + '.jpg';
    resizeAndPut(src, dest, s3, sizes[k]);
}
fs.unlink(src);​  /* delete the source file now */

var resizeAndPut = function (src, dest, s3, size) {
    easyimage.resize(
    {
        src:    src,
        dst:    dest,
        width:  size,
        height: size
    }, function(err, image) {
            if (err) throw err;
            knox.putFile(dest, s3, function(err, res) {  /* does image contain the path?, if so, might want to use image.path or the like instead of dest here */
                if (err) throw err;
                fs.unlink(dest); /* delete the local file*/
            });

    });
};