您的位置:首页 > Web前端 > Node.js

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

2018-03-31 19:57 741 查看
在这个功能中,我使用了以下四个模块的一些方法,关于这四个模块的详情可以点击下方查阅:

request,用来请求资源
progress-stream,用来显示进度信息

unzip,用来解压缩

fs,用来创建读写流
该功能的流程是:

创建写入流 fs.createWriteStream
请求zip文件 request.get(options)
在request请求的回调函数中获取zip文件大小并设置length参数 length: response.headers['content-length']
设置好length参数之后再重新request请求zip文件(否则无法获取length参数,进度信息会有误)
将request请求到的文件流pipe进progress-stream的实例(proStream)中去监听zip文件下载进度 request.get(options).pipe(proStream)及proStream.on('progress', function(progress){...})
zip文件下载完成,触发zip文件的finish事件
解压缩
代码如下,
var request = require('request');
var unzip = require('unzip');
var progress = require('progress-stream');
var fs = require('fs');
var tZip = fs.createWriteStream('./XXX.zip');/zip文件的写入流
var tExe = fs.createWriteStream('./XXX.exe');//解压之后的exe文件的写入流
var zipUrl = decodeURI(url);//zip文件的地址,防止连接中有中文字符出错使用decodeURI
tZip.on('finish', () => {
    $("#update p").text("压缩下载完成,即将解压缩");
    //解压文件
    fs.createReadStream('./XXX.zip').pipe(unzip.Parse()).on('entry', function (entry) {
console.log(entry);
        entry.pipe(tExe);
    });

});
tExe.on("finish",function (){
    console.log("解压完成");
})
tZip.on('error', () => {
    console.error('error');
});
var options = {
    url:zipUrl,
    encoding:null//当请求的是二进制文件时,一定要设置
}
request.get(options).on('response',function (response){//显示进度条
    console.log(response);
    var proStream = progress({
    	length: response.headers['content-length'],
time: 500 /* ms */
    });
    
    proStream.on('progress', function(progress) {
        var percentage = Math.round(progress.percentage)
        $(".progress-bar").css('width',percentage+"%");
        $(".percent").text(percentage+"%");
    });
    request.get(options).pipe(proStream).pipe(tZip);//先pipe到proStream再pipe到文件的写入流中
})
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: