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