Node.js中实时显示下载进度并解压文件

在这个功能中,我使用了以下四个模块的一些方法,关于这四个模块的详情可以点击下方查阅:

 

该功能的流程是:

 

  1. 创建写入流 fs.createWriteStream
  2. 请求zip文件 request.get(options)
  3. 在request请求的回调函数中获取zip文件大小并设置length参数 length: response.headers[‘content-length’]
  4. 设置好length参数之后再重新request请求zip文件(否则无法获取length参数,进度信息会有误)
  5. 将request请求到的文件流pipe进progress-stream的实例(proStream)中去监听zip文件下载进度 request.get(options).pipe(proStream)及proStream.on(‘progress’, function(progress){…})
  6. zip文件下载完成,触发zip文件的finish事件
  7. 解压缩

代码如下,

var request = require('request');
var unzip = require('unzip');
var progress = require('progress-stream');
var fs = require('fs');
var tZipWStream = fs.createWriteStream('./XXX.zip');/zip文件的写入流
var tExeWStream = fs.createWriteStream('./XXX.exe');//解压之后的exe文件的写入流
var tZipUrl = decodeURI(url);//zip文件的地址,防止连接中有中文字符出错使用decodeURI
var tZipHost = tZipUrl.match(/http.+?com/)[0].split("http://")[1];
var tZipPath =  tZipUrl.split("com")[
tZipWStream.on('finish', () => {
    $("#update p").text("压缩包下载完成,即将解压缩");
    //解压文件
    fs.createReadStream('./XXX.zip').pipe(unzip.Parse()).on('entry', function (entry) {
	console.log(entry);
        entry.pipe(tExeWStream);
    });

});
tExeWStream.on("finish",function (){
    console.log("解压完成");
})
tZipWStream.on('error', (err) => {
    console.error('error');
});
var options = {
    url:tZipUrl,//请求zip文件的url
    encoding:null//当请求的是二进制文件时,一定要设置
}
var req = http.request({
    host:tZipHost,
    path:tZipPath,
    method:'HEAD'
},function (res){//显示进度条
    if (res.statusCode == 200) {
        res.setEncoding(null);
        var str = progress({
            length: res.headers['content-length'],
            time: 500 /* ms */
        });
        str.on('progress', function(progress) {
            var percentage = Math.round(progress.percentage)
            $(".progress-bar").css('width',percentage+"%");
            $(".percent").text(percentage+"%");
        });
        request.get(options).pipe(str).pipe(tZipWStream);
    } else {
        addErr("filePath:"+tZipUrl+",statusCode:"+response.statusCode);
        showLogin();
    }
})
req.on('error', (e) => {
    addErr(e);
    showLogin();
});
req.end();

 

    原文作者:朱维娜
    原文地址: https://blog.csdn.net/zhu_06/article/details/79772229
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞