2010-09-30 79 views
3

我有兩個nodejs http服務器,一個請求另一個tar文件。它可以通過瀏覽器測試正常工作,但我永遠無法讓第二臺服務器正確地粘貼在一起。我與fwrite的嘗試已經無用,因爲這通過NodeJS下載Tar文件

// Receives File 
var complete_file = ''; 
response.on('data', function(chunk){ 
    complete_file += chunk 
}).on('end', function(){ 
    fs.writeFile('/tmp/test.tgz', complete_file, 'binary') 
}); 

// Send File 
fs.readFile('/tmp/test_send.tgz', function(err, data){ 
    if (err) throw err; 
    response.writeHead('200', { 
     'Content-Type' : 'application/x-compressed', 
     'Content-Length' : data.length 
    }); 
    response.write(data); 
    response.end(); 
}); 

回答

6

我設法使它工作,但我使用了一個可寫流代替,這是客戶端代碼:

fs = require ('fs'); 

var http = require('http'); 
var local = http.createClient(8124, 'localhost'); 
var request = local.request('GET', '/',{'host': 'localhost'}); 
request.on('response', function (response) { 
    console.log('STATUS: ' + response.statusCode); 
    var headers = JSON.stringify(response.headers); 
    console.log('HEADERS: ' + headers); 
    var file = fs.createWriteStream('/tmp/node/test.gz'); 
    response.on('data', function(chunk){ 
     file.write(chunk); 
     }).on('end', function(){ 
      file.end(); 
      }); 
    }); 
request.end(); 
+1

對不起,我花了這麼長時間才接受這個作爲一個答案。 – 2010-11-02 06:31:53

2

什麼有關請求包?

,你可以這樣做:

request(fileurl).pipe(fs.createWriteStream(savetohere)) 
+0

很好的答案,錯誤處理的任何選項? – hitautodestruct 2017-11-21 08:44:31

4

這在節點的新版本已經改變。

這裏是最新的,並且添加更多的邏輯更加努力完成下載,如encouting 301,302 ...

function getFile(url, path, cb) { 
    var http_or_https = http; 
    if (/^https:\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/.test(url)) { 
     http_or_https = https; 
    } 
    http_or_https.get(url, function(response) { 
     var headers = JSON.stringify(response.headers); 
     switch(response.statusCode) { 
      case 200: 
       var file = fs.createWriteStream(path); 
       response.on('data', function(chunk){ 
        file.write(chunk); 
       }).on('end', function(){ 
        file.end(); 
        cb(null); 
       }); 
       break; 
      case 301: 
      case 302: 
      case 303: 
      case 307: 
       getFile(response.headers.location, path, cb); 
       break; 
      default: 
       cb(new Error('Server responded with status code ' + response.statusCode)); 
     } 

    }) 
    .on('error', function(err) { 
     cb(err); 
    }); 
}