2013-10-08 66 views
5

Flickr APIを使用してFlickrから多数のファイルをダウンロードしようとしていて、ループ内でhttp.get()を呼び出そうとしています。node.jsのURLからファイルを同期的にダウンロードする方法

画像の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.最後にエラーがあります: events.js:72 throw er; //未処理の 'エラー' のイベントが ^ エラー:Socket.socketOnEndで [としてonend](http.js:1538:23) Socket.gのソケットは(::1442年15 http.js)createHangUpErrorで をハングアップ(events.js:14:175)Socket.EventEmitter.emitで 910:16 process._tickCallbackで(のNode.js:415:13)

_stream_readable.jsで (events.js:20:117)
+4

これを同期させることは、あなたがそれを行う方法を見つけ出すことができても、強くお勧めします。ダウンロードするファイルのキューを作成し、イメージが1つずつ、または一度にいくつでもダウンロードできるように、そのキューを実行することをお勧めします。あなたが気づいたように、抑制は重要です。 – 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

がそうかもしれないし、そうでないかもしれない)私はそれを、ありがとう。 –

関連する問題