2013-10-08 61 views
5

我试图使用Flickr API和http.get()调用从循环中下载大量来自Flickr的文件。如何从node.js中的URL同步下载文件

我有图像网址的数组,我使用“下载”功能下载图片 如果有大量的图像,大部分都是空文件。 我在这里找到了下载代码。
请教如何解决这个问题。
在此先感谢!

for (i=1;i<100;i++){ 

    filename= "./images/file"+i+".jpg"; 

    download(photourl[i], filename,{}); 


    } //End of for-loop 

..... 

var download = function(url, dest, cb) { 
    var file = fs.createWriteStream(dest); 
    var request = http.get(url, function(response) { 
    response.pipe(file); 
    file.on('finish', function() { 
     file.close(); 
     //cb(); 
    }); 
    }); 
} 

P.S.然后最后有错误: events.js:72 throw er; //未处理'错误'事件 ^ 错误:套接字在Socket.gocketOnEnd [as onend](http.js:1538:23) 处的create.gangUpError(http.js:1442:15) 处挂起(events.js:175:14) 在Socket.EventEmitter.emit(events.js:117:20) 在_stream_readable.js:910:16 在process._tickCallback(node.js中:415:13)

+4

我强烈建议不要同步这样做,即使你能够弄清楚如何做到这一点。我建议创建一个队列的文件下载,并运行该队列,因为图像是一次一个下载,或者一次下载多少。正如你所注意到的那样,节流很重要。 – Brad

+1

布拉德,谢谢!我该如何开始? – user2013424

回答

3

我建议使用异步模块此:

var i = 1, threads = 5; 
require('async').eachLimit(photourl, threads, function(url, next){ 
    download(url, "./images/file"+(i++)+".jpg", next); 
}, function(){ 
    console.log('finished'); 
}) 

并取消CB();在下载功能

+1

也许'eachLimit'会是一个更好的选择,而不是试图同时下载**所有**图像。 – WiredPrairie

+0

可能是,也可能不是)我改变它,谢谢。 –