2016-03-02 84 views
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--) { 
    var file = fs.createWriteStream(arr[i].split('/').pop(-1).toLowerCase().replace("%20", "-")); 
    var request = http.get(arr[i], function(response) { 
     response.pipe(file); 
    }); 
}; 

但如当我运行这个代码时,第一个文件是空的,只有第二个文件被下载。你能帮我解决这个问题吗?

回答

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]); 
}; 
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); 
    }); 
});