2016-07-24 2 views
1

Pardonnez-moi que le code est en désordre. Je continue d'apprendre. Je dois télécharger l'image avec l'analyse d'URL à partir d'un fichier CSV. Cependant, j'ai plus de 2000+ d'URL avec le même domaine, et je ne pense pas que le serveur me permettra de tout tirer dans un aller donc je reçois toujours une erreur après quelques images. Problème que j'ai besoin de résoudre -
1) Comment s'assurer que les images sont téléchargées complètement alors seulement le code passe à l'URL suivante
2) Comment écrire un meilleur code
Votre aide est appréciée. MerciTélécharger l'image avec la demande de noeud avec l'analyse d'URL de CSV

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(){ 

     }); 
    } 

}); 

Répondre

1

Cela va limiter vos demandes à un à la fois. Une autre option consiste à utiliser throttled-request pour limiter les demandes par unité de temps.

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

En outre, votre variable d'enregistrements est hors de portée, vous devez le déplacer dans le but d'y accéder:

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'); 
     }); 
    }); 
}); 
+0

Merci Maté! Il fonctionne maintenant :) – user2982110