如何在node.js中同步下载来自URL的文件

8
我正在尝试使用Flickr API和循环中的http.get()调用从Flickr下载多个文件。我有图像URL的数组,并使用“download”函数来下载图片。如果图片数量很大,那么大部分都是空文件。我在这里找到了下载代码。请指导如何解决该问题。先行致谢!
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();
    });
  });
}

最后,还有一个错误:events.js:72 throw er; // 未处理的 'error' 事件 ^ Error: socket hang up at createHangUpError (http.js:1442:15) at Socket.socketOnEnd [as onend] (http.js:1538:23) at Socket.g (events.js:175:14) at Socket.EventEmitter.emit (events.js:117:20) at _stream_readable.js:910:16 at process._tickCallback (node.js:415:13)


4
我强烈建议不要同步进行这个操作,即使您能够找到如何这样做的方法。我建议创建一个文件下载队列,并在图片逐个下载或同时下载多张图片时运行该队列。正如您已经注意到的那样,限速非常重要。 - Brad
1
Brad,谢谢!我该如何开始? - user2013424
1个回答

4
我建议在这种情况下使用async模块:
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
可能会改变,也可能不会,谢谢。 - vp_arth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接