使用Node.js下载多个图像

时间:2016-03-02 09:58:02

标签: javascript node.js

我需要一次从几个网站下载很多文件,我有这个代码

var http = require('http');
var fs = require('fs');

var arr = ['http://www.bonyfarma.com/images/Bony%20Air.jpg', 'http://www.bonyfarma.com/images/Bony%20A-Booster.jpg'];

for (var i = arr.length - 1; i >= 0; i--) {
    var file = fs.createWriteStream(arr[i].split('/').pop(-1).toLowerCase().replace("%20", "-"));
    var request = http.get(arr[i], function(response) {
        response.pipe(file);
    });
};

但是,例如当我运行此代码时,第一个文件为空,只下载了第二个文件..你能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

var http = require('http');
var fs = require('fs');

var arr = ['http://www.bonyfarma.com/images/Bony%20Air.jpg', 'http://www.bonyfarma.com/images/Bony%20A-Booster.jpg'];

for (var i = arr.length - 1; i >= 0; i--) {
    (function(url){
        var file = fs.createWriteStream(url.split('/').pop(-1).toLowerCase().replace("%20", "-"));
        http.get(url, function(response) {
            response.pipe(file);
        });
    })(arr[i]);
};

答案 1 :(得分:0)

原因是您的file变量在for循环之外被提升。这导致所有响应都流向最后一个流创建。

解决这个问题的最简单方法是使用简单的Array.prototype.forEach(节点支持这个)正确地确定var的范围:

arr.forEach(function(url) {
    var file = fs.createWriteStream(url.split('/').pop(-1).toLowerCase().replace("%20", "-"));
    var request = http.get(url, function(response) {
        response.pipe(file);
    });
});