在这个功能中,我使用了以下四个模块的一些方法,关于这四个模块的详情可以点击下方查阅:
该功能的流程是:
- 创建写入流 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 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();