Télécharger Tar File via NodeJS

J'ai deux serveurs http nodejs, on demande un fichier tar de l'autre. Cela fonctionne bien via les tests du navigateur, mais je ne peux jamais obtenir le deuxième serveur pour coller correctement les morceaux. Mes tentatives avec fwrite ont été aussi inutiles que cela

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

J'ai réussi à le faire fonctionner, mais j'utilise un flux écrite, 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(); 

Cela a changé dans les versions plus récentes de Node.

Voici le dernier, et j'ajoute plus de logique pour essayer plus difficile de terminer le téléchargement, comme encadrer 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); }); } 

Qu'en est-il du paquet de demande?

tu peux le faire:

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