如何在Node JS中构build用于下载文件的wget进度条?

我正在编写一个命令行工具,从网上下载一个软件。 requestrequest-progress模块下载。 代码如下(与官方logging的一样)。 现在我想显示下载类似wget下载进度条的进度?

 var fs = require('fs'); var request = require('request'); var progress = require('request-progress'); // The options argument is optional so you can omit it progress(request('https://az412801.vo.msecnd.net/vhd/VMBuild_20141027/VirtualBox/IE11/Windows/IE11.Win8.1.For.Windows.VirtualBox.zip'), { // throttle: 2000, // Throttle the progress event to 2000ms, defaults to 1000ms // delay: 1000, // Only start to emit after 1000ms delay, defaults to 0ms // lengthHeader: 'x-transfer-length' // Length header to use, defaults to content-length }) .on('progress', function (state) { // The state is an object that looks like this: // { // percent: 0.5, // Overall percent (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) // } // } console.log('progress', state); }) .on('error', function (err) { // Do something with err }) .on('end', function () { // Do something after request finishes }) .pipe(fs.createWriteStream('IE11.Win8.1.For.Windows.VirtualBox.zip')); 

上述计划的进度条 上述计划的进度条

如何获得进度栏一些这类似于nodejs wget ? 简单地了解我添加了wget截图,以便下载相同的文件。 它简单而高效。 wget进度条-1

这是一个工作的例子,但没有打磨,你可能需要调整一些东西:

 const fs = require('fs'); const request = require('request'); const progress = require('request-progress'); const readline = require('readline') const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); const filename = 'IE11.Win8.1.For.Windows.VirtualBox.zip'; progress(request('https://az412801.vo.msecnd.net/vhd/VMBuild_20141027/VirtualBox/IE11/Windows/IE11.Win8.1.For.Windows.VirtualBox.zip'), { }) .on('progress', function (state) { readline.clearLine(rl, 0); readline.cursorTo(rl, 0); rl.write(statusBar(filename, state)); }) .on('error', function (err) { // Do something with err }) .on('end', function () { // Do something after request finishes }) .pipe(fs.createWriteStream(filename)); function statusBar(filename, progress) { let str = `${filename} `; str += progressBar(progress.percent); str += stats(progress); return str; } function progressBar(percent) { percent = Math.floor(percent * 100); let str = `%${percent}[`; str += '='.repeat(percent); str += '>' str += ' '.repeat(99 - percent); str += '] '; return str } function stats({speed, size, time}) { const sizeM = Math.round(size.transferred / 1024) const speedMb = Math.round(speed * 0.000008) const eta = new Date(time.remaining * 1000).toISOString().substr(11, 8); return `${sizeM}M ${speedMb}MB/s eta ${eta}`; } 

注意:

我正在使用一些ES6function,如:

  • String.prototype.repeat
  • 模板文字
  • 解构赋值 (在函数统计上)

我认为这个代码是自我解释的,请确保你阅读readline文档

截图:

wget节点中的进度条