2016-11-19 6 views
1

nodejsのリクエストモジュールを使用してURLを取得していますが、サーバーのダウンロードが完了したときにURLからファイル(+ 200mb)クラッシュするか遅くなるまで減速を開始します。NodeJSでURLから大きなファイルをダウンロードするときにサーバーがクラッシュする

はここに私の現在のコードだ(それはファイル全体をダウンロードしますが、最終的には私のサーバーがクラッシュした):

//Required modules 
var http = require('http'), 
url = require("url"), 
fs = require('fs'), 
request = require('request'), 
path = require("path"), 
events = require("events"), 
j = request.jar(), 
request = request.defaults({ jar : j }); 

// make te request login in with cookies 
console.log("downloading file :)"); 
request({ 
    url:"http://example.com/", 
    method:"POST", 
    form:{u: "username",p: "password"} 
    }, 
    function(error,response,body){ 
     setTimeout(function(){ 
      request 
       .get('http://example.com/test.ashx?file=15') 
       .on('error', function(err) { 
       console.log(err); 
       }) 
       .pipe(fs.createWriteStream("/var/www/filesDir/CustomName.zip")); 
       console.log(body); 
     },1000) 
    } 
); 

私はthis answerから別の溶液を塗布しようとしたが、何らかの理由でファイルが正しくダウンロードされていませんそれは、常に "ダウンロードの進捗状況:0バイト"だけを示しているかもしれません。これはログインアクセスに関連するものかもしれません。

var http = require('http'); 
var fs = require('fs'); 
var url = require("url"); 
var request = require('request'); 
var path = require("path"); 
var events = require("events"); 
var j = request.jar(); 
var request = request.defaults({ jar : j }); 


request({ 
    url:"http://example.com/", 
    method:"POST", 
    form:{u:"username",p:"password"} 
    }, function(error,response,body){ 
       var downloadfile = "http://example.com/test.ashx?file=15"; 
       var host = url.parse(downloadfile).hostname; 
       var filename = "1977.zip"; 
       var req = http.request({port: 80, host: host, method: 'GET'}); 
       console.log("Downloading file: " + filename); 
       console.log("Before download request"); 
       req.end(); 

       dlprogress = 0; 

       setInterval(function() { 
        console.log("Download progress: " + dlprogress + " bytes"); 
       }, 1000); 

       req.addListener('response', function (response) { 
        var downloadfile = fs.createWriteStream(filename, {'flags': 'a'}); 
        console.log("File size " + filename + ": " + response.headers['content-length'] + " bytes."); 
        response.addListener('data', function (chunk) { 
         dlprogress += chunk.length; 
         downloadfile.write(chunk, encoding='binary'); 
        }); 
        response.addListener("end", function() { 
         downloadfile.end(); 
         console.log("Finished downloading " + filename); 
        }); 

       }); 
     } 
); 

あなたが私を助けることにしたどの方法もかまいません:

は、ここで私は私が最後の文から実装しようとしている他のコードを置きます。

答えて

1

が、私はこのようにそれをやってしまった、私はコードを複数回テストしてみたサーバーはもうクラッシュしませんでした:

var request = require('request'); 
var filed = require('filed'); 
var j = request.jar(); 
var request = request.defaults({ jar : j }); 

// make the request and login 
request({ 
    url: "http://example.com/login", 
    method:"POST", 
    // 'u' and 'p' are the field names on the form 
    form:{u:"username",p:"password"} 
    }, function(error,response,body){ 
     setTimeout(function(){ 
      var downloadURL = 'http://example.com/download/file.zip'; 
      var downloadPath = "/path/to/download/localNameForFile.zip"; 

      var downloadFile = filed(downloadPath); 
      var r = request(downloadURL).pipe(downloadFile); 

      r.on('data', function(data) { 
       console.log('binary data received'); 
      }); 
      downloadFile.on('end', function() { 
       console.log(downloadPath, 'file downloaded to path'); 
      }); 

      downloadFile.on('error', function (err) { 
       console.log(err, 'error downloading file'); 
      }); 
     },3000) 
    } 
); 
関連する問題