tutorial sistema para operativo nodejs node framework espaƱol ejemplos node.js download request progress

node.js - sistema - npm



Obtener el progreso de la descarga en Node.js con solicitud (6)

Estoy creando un actualizador que descarga archivos de aplicaciones usando la request módulo Nodo. ¿Cómo puedo usar chunk.length para estimar el tamaño del archivo restante? Aquí hay 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 obtener el total que desea:

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" + ".<br/> 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); }); }); };


Escribí un módulo que simplemente hace lo que desea: barra de estado .

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


Usando el módulo cool request-request-progress , podría 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''))


En caso de que alguien quiera saber el progreso sin el uso de otra biblioteca, pero solo solicite, 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("https://static.pexels.com/photos/36487/above-adventure-aerial-air.jpg","c:/path/to/local-image.jpg");

La variable received_bytes guarda el total de cada longitud de fragmento enviado y de acuerdo con total_bytes , el progreso es retrieven.


Si está utilizando un 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."); }