Obtener progreso de descarga en Node.js con solicitud

Estoy creando un actualizador que descarga los archivos de la aplicación utilizando la request módulo Node. ¿Cómo puedo usar chunk.length para estimar el tamaño del archivo restante? Aquí está parte de mi código:

 var file_url = 'http://foo.com/bar.zip'; var out = fs.createWriteStream('baz.zip'); var req = request({ method: 'GET', uri: file_url }); req.pipe(out); req.on('data', function (chunk) { console.log(chunk.length); }); req.on('end', function() { //Do something }); 

Esto debería darte el total que deseas:

 req.on( 'response', function ( data ) { console.log( data.headers[ 'content-length' ] ); } ); 

Obtengo una longitud de contenido de 9404541

 function download(url, callback, encoding){ var request = http.get(url, function(response) { if (encoding){ response.setEncoding(encoding); } var len = parseInt(response.headers['content-length'], 10); var body = ""; var cur = 0; var obj = document.getElementById('js-progress'); var total = len / 1048576; //1048576 - bytes in 1Megabyte response.on("data", function(chunk) { body += chunk; cur += chunk.length; obj.innerHTML = "Downloading " + (100.0 * cur / len).toFixed(2) + "% " + (cur / 1048576).toFixed(2) + " mb\r" + ".
Total size: " + total.toFixed(2) + " mb"; }); response.on("end", function() { callback(body); obj.innerHTML = "Downloading complete"; }); request.on("error", function(e){ console.log("Error: " + e.message); }); }); };

Usando el módulo cool node request request , puede hacer algo como esto en es2015:

 import { createWriteStream } from 'fs' import request from 'request' import progress from 'request-progress' progress(request('http://foo.com/bar.zip')) .on('progress', state => { console.log(state) /* { percentage: 0.5, // Overall percentage (between 0 to 1) speed: 554732, // The download speed in bytes/sec size: { total: 90044871, // The total payload size in bytes transferred: 27610959 // The transferred payload size in bytes }, time: { elapsed: 36.235, // The total elapsed seconds since the start (3 decimals) remaining: 81.403 // The remaining seconds to finish (3 decimals) } } */ }) .on('error', err => console.log(err)) .on('end', () => {}) .pipe(createWriteStream('bar.zip')) 

Escribí un módulo que solo hace lo que quieres: barra de estado .

 var bar = statusBar.create ({ total: res.headers["content-length"] }) .on ("render", function (stats){ websockets.send (stats); }) req.pipe (bar); 

Si está utilizando el módulo de “solicitud” y desea mostrar el porcentaje de descarga sin utilizar ningún módulo adicional, puede usar el siguiente código:

 function getInstallerFile (installerfileURL) { // Variable to save downloading progress var received_bytes = 0; var total_bytes = 0; var outStream = fs.createWriteStream(INSTALLER_FILE); request .get(installerfileURL) .on('error', function(err) { console.log(err); }) .on('response', function(data) { total_bytes = parseInt(data.headers['content-length']); }) .on('data', function(chunk) { received_bytes += chunk.length; showDownloadingProgress(received_bytes, total_bytes); }) .pipe(outStream); }; function showDownloadingProgress(received, total) { var percentage = ((received * 100) / total).toFixed(2); process.stdout.write((platform == 'win32') ? "\033[0G": "\r"); process.stdout.write(percentage + "% | " + received + " bytes downloaded out of " + total + " bytes."); } 

En caso de que alguien quiera saber el progreso sin el uso de otra biblioteca pero solo solicitar, puede usar el siguiente método:

 function downloadFile(file_url , targetPath){ // Save variable to know progress var received_bytes = 0; var total_bytes = 0; var req = request({ method: 'GET', uri: file_url }); var out = fs.createWriteStream(targetPath); req.pipe(out); req.on('response', function ( data ) { // Change the total bytes value to get progress later. total_bytes = parseInt(data.headers['content-length' ]); }); req.on('data', function(chunk) { // Update the received bytes received_bytes += chunk.length; showProgress(received_bytes, total_bytes); }); req.on('end', function() { alert("File succesfully downloaded"); }); } function showProgress(received,total){ var percentage = (received * 100) / total; console.log(percentage + "% | " + received + " bytes out of " + total + " bytes."); // 50% | 50000 bytes received out of 100000 bytes. } downloadFile("http://sofes.miximages.com/progress/above-adventure-aerial-air.jpg","c:/path/to/local-image.jpg"); 

La variable total_bytes guarda el total de cada longitud de fragmento enviado y, según los total_bytes , el progreso se recupera.

disculpe, estoy escribiendo una respuesta aquí, me quedé sin preguntas hace un par de años … ¿Puede leer este código? Por alguna razón, esto no funciona.

Estoy ejecutando nodejs a través de node-webkit (nwjs)

  download.pipe(fs.createWriteStream('downloads/'+info.video_id+'.mp4')); download.on('response', (data) => { total_size = parseInit(data.headers['content-lenght']); }); download.on('data', (chunk) => { recieved_size += chunk.lenght; showProgress(recieved_size, total_size); }); download.on('finish', () => { console.log('All downloaded!'); $('#results').append("
  • "+info.title+" - Download
  • "); });

    Estoy intentando obtener el estado actual del proceso, es decir, un estado de progreso …

     function showProgress(r, t) { var perc = (r*100)/t; console.log(perc + "% | " + r + " bytes out of " + t + " bytes."); } 
      Intereting Posts