2010-09-30 6 views
3

J'ai deux serveurs http nodejs, l'un demande un fichier tar de l'autre. Cela fonctionne bien via le test du navigateur, mais je ne peux jamais obtenir le deuxième serveur pour coller les morceaux ensemble correctement. Mes tentatives avec fwrite a été aussi inutile que cetteTélécharger le fichier Tar via 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(); 
}); 

Répondre

6

J'ai réussi à le faire fonctionner mais j'utiliser un flux inscriptible à la place, c'est le code client:

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

Désolé, il m'a fallu si longtemps pour accepter cela comme une réponse. –

2

ce que sur le package de demande ?

vous pouvez le faire:

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

Grande réponse, une option sur la gestion des erreurs? – hitautodestruct

4

Cela a changé dans les versions les plus récentes de nœud.

Voici le dernier, et j'ajouter plus logique d'essayer plus difficile de terminer le téléchargement tels que encouting 301302 ...

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