2010-09-30 4 views
3

У меня есть два http-сервера nodejs, один из которых запрашивает файл tar из другого. Он отлично работает с помощью тестирования браузера, но я не могу заставить второй сервер правильно склеить куски. Мои попытки с FWRITE было бесполезным, как этоЗагрузить tar-файл через NodeJS

// 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

Жаль, что мне потребовалось так много времени, чтобы принять это в качестве ответа. –

2

насчет запроса пакета ?

вы можете сделать это:

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

Отличный ответ, любой вариант при обработке ошибок? – hitautodestruct

4

Это изменилось в новых версиях Node.

Вот последняя, ​​и добавить больше логики стараться, чтобы закончить загрузку, таких как 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); 
    }); 
} 
Смежные вопросы