2016-07-24 5 views
1

용서해주십시오. 코드가 엉망입니다. 나는 아직도 배우고있다. CSV 파일에서 URL 스캔을 사용하여 이미지를 다운로드해야합니다. 그러나 나는 2000 + URL을 동일한 도메인에 있고, 나는 서버가 모든 것을 끌어 당길 수있게 할 것이라고 생각하지 않는다. 따라서 나는 어떤 이미지들 후에 항상 에러를 얻는다. 해결해야 할 문제 -
1) 이미지를 완전히 다운로드 한 다음 코드 만 다음 URL로 이동하는 방법
2) 더 나은 코드 작성 방법
도움을 주시면 감사하겠습니다. 고맙습니다.CSV에서 URL 스캔을 사용하여 노드 요청으로 이미지 다운로드

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

     }); 
    } 

}); 

답변

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

, 레코드 변수가 범위를 벗어나, 당신은에 액세스하기 위해 그것을 밖으로 이동해야합니다

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

감사 메이트! 지금 실행 중입니다 :) – user2982110

관련 문제