1

コードが汚いのでご容赦ください。まだ勉強してる。CSV ファイルから URL スキャンを使用して画像をダウンロードする必要があります。ただし、同じドメインの URL が 2000 以上あります。サーバーがすべてを一度に取得できるとは思わないため、いくつかの画像の後に常にエラーが発生します。私が解決する必要がある問題 -
1) 画像が完全にダウンロードされ、コードだけが次の URL に移動することを確認する
方法 2) より良いコードを作成する方法
あなたの助けに感謝します。ありがとうございました

var csv = require('fast-csv');
var Promise = require('bluebird');
var fs = require('fs'); 
var request = require('request');
var path = "test.csv";

var promiseCSV = Promise.method(function(path, options) {
  return new Promise(function(resolve, reject) {
    var records = [];
    csv
      .fromPath(path, options)
      .on('data', function(record) {
        records.push(record);
      })
      .on('end', function() {
        resolve(records);
        console.log('done');
      });
  });
});



var download = function(uri, filename, callback){
  request.head(uri, function(err, res, body){

    request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
  });
};


promiseCSV(path).then(function (records) {

for(i=0;i<records.length;i++)
  {     
        download(records[i][0],'img/'+records[i][1], function(){

        });
    }

});
4

1 に答える 1

1

これにより、リクエストが一度に 1 つに絞り込まれます。別のオプションは、throttled-requestを使用して、単位時間あたりのリクエスト数を制限することです。

var i = 0;
promiseCSV(path).then(function (records) {
  next();
  function next(){
    download(records[i][0],'img/'+records[i][1], function(){
      i++;
      if (i < records.length) next();
    });
  }
});

また、records 変数は範囲外です。アクセスするには、変数を移動する必要があります。

var records = []; // move out to global scope to access from elsewhere
var promiseCSV = Promise.method(function(path, options) {
  return new Promise(function(resolve, reject) {
    csv
      .fromPath(path, options)
      .on('data', function(record) {
        records.push(record);
      })
      .on('end', function() {
        resolve(records);
        console.log('done');
      });
  });
});
于 2016-07-24T11:53:48.170 に答える