js gzip压缩(jszip读取文件),本文通过数据整理汇集了js gzip压缩(jszip读取文件)相关信息,下面一起看看。

相信大家对ZIP文件都很熟悉。当你想打开一个本地ZIP文件时,你需要先安装支持ZIP文件解压的解压软件。但是如果预解压的ZIP文件在服务器上,我们该怎么办呢?最简单的解决方法就是在本地下载文件,然后使用支持ZIP格式的解压软件进行解压。那么可以在线解压ZIP文件吗?答案是肯定的。接下来阿宝哥将介绍两种在线解压ZIP文件的方案:浏览器解压和服务器解压。

在介绍两种在线解压ZIP文件的方案之前,让让我们简单看一下zip文件格式。

ZIP文件格式是一种用于数据压缩和文档存储的文件格式。最初命名为Deflate,是由菲利普卡兹发明的,他在1989年1月发表了这种格式的数据。ZIP通常使用后缀 。zip ,其MIME格式为 应用程序/zip ;目前,ZIP格式是几种主流压缩格式之一,其竞争对手包括开源代码的RAR格式和7z格式。

ZIP是一种相当简单的归档格式,它单独压缩每个文件,这样就可以在不读取其他数据的情况下检索独立的文件。理论上,这种格式允许不同的算法用于不同的文件。然而,在实践中,大多数zip都使用Katz # s DEFLATE算法。

简单介绍完ZIP格式,接下来,阿宝哥先介绍一下基于JSZip库的浏览器解压方案。

注意 全栈修仙之路 并阅读4本免费电子书(共3万次下载)和11本阿宝哥创作的Vue 3高级系列教程。

JS这是一个用于创建、阅读和编辑的JavaScript库。压缩文件。该库支持大多数浏览器,具体兼容性如下图所示:

其实借助JSZip库,在浏览器端实现在线解压Zip文件的功能并不难。因为官方已经给我们提供了完整的解压本地文件,解压远程文件,生成ZIP文件的例子。好了,事不宜迟,让一步一步实现在线解压zip文件的功能。

浏览器在线解压zip文件的功能可以分为三个小功能:下载ZIP文件,解析ZIP文件,显示ZIP文件。考虑到函数的复用性,Po Ge在ExeJSZip类中封装了下载ZIP文件和解析ZIP文件的逻辑:

ExeJSZip类{

//用于获取url地址对应的文件内容

getBinaryContent(url,progressFn=()={}) {

返回新承诺((解决,拒绝)={

if(URL的类型!==#;字符串|| !/https?/.测试(url))

拒绝(新错误(非法的URL参数));

JSZIPUTILS。GetBinaryContent (URL,{//JSZIPUTILS来自库jszip-utils

进展:进步Fn,

回调:(err,data)={

如果(错误){

拒绝(err);

}否则{

解决(数据);

}

},

});

});

}

//遍历Zip文件

异步迭代文件(数据,迭代Fn) {

if(迭代类型Fn!==#;函数) {

抛出新错误(iterationFn不是函数类型);

}

让zip

尝试{

zip=await jszip . load async(data);//JSZip来自库JSZip。

zip . foreach(iteration fn);

返回zip

} catch(错误){

抛出新错误();

}

}

}

有了ExeJSZip类的实例,我们就可以轻松实现在线解压Zip文件的功能:

请输入ZIP文件的在线地址:

在线解压

const zipUrlEle=document . query selector(# zipUrl # );

const status ele=document . query selector(#状态);

const file list=document . query selector(#文件列表);

const exeJSZip=new exeJSZip();

//执行在线解压缩操作。

异步函数unzipOnline() {

fileList.innerHTML= # #;

StatusEle.innerText= # 开始下载文件.#;

const data=await exejszip . getbinarycontent(

zipUrlEle.value,

处理进度

);

let items= # #;

await exejszip . iterate zipfile(data,(relativePath,zipEntry)={

项目=`个

$ { zip entry . name } `;

});

StatusEle.innerText= # ZIP文件解压缩成功

fileList.innerHTML=items

}

//处理下载进度

函数handleProgress(progressData) {

const { percent,loaded,total }=progressData

if (loaded===total) {

StatusEle.innerText= # 文件已经下载,正在解压缩

}

好了,如何在浏览器端实现通过JSZip库在线解压zip文件的功能已经介绍过了。让让我们看看上面例子的运行结果:

现在已经可以在线解压ZIP文件了,可能有朋友会问,可以预览解压后的文件吗?答案是肯定的,因为JSZip库为我们提供了文件API,通过它我们可以读取指定文件的内容。例如,使用zip . file(amount.txt # ).异步(数组缓冲),然后我们就可以进行相应的操作来实现文件预览的功能。

需要注意的是,基于JSZip的方案并不完美,它有一定的局限性。例如,它不t支持加密ZIP文件的解压缩。解压大文件时,IE 10以下的浏览器可能会出现闪回问题。另外它还有一些其他的限制,Po在这里就不细说了。感兴趣的朋友,可以阅读JSZip的局限性一文中的相关内容。

由于浏览器解压方案存在一些弊端,特别是在大文件在线解压的情况下,可以考虑使用服务器解压方案来解决这个问题。

服务器解压缩方案是允许用户通过文件ID或文件名在线解压缩文件。接下来,Po Ge将介绍如何基于koa和node-stream-zip实现服务器在线解压ZIP文件的功能。如果你不我对koa一无所知,建议你先看看koa的官方文件。

const path=require(路径);

const Koa=require(koa # );

const CORS=require(@ KOA/CORS );

const Router=require(@ KOA/router );

const stream zip=require(节点-流-zip );

const app=new Koa();

const router=新路由器();

const ZIP _ HOME=path . join(_ _ dirname,zip # );zip文件的根目录

const UnzipCaches=new Map();//保存解压缩后的文件信息。

router . get(/#;异步(ctx)={

Ctx.body= # 服务器端在线解压zip文件(Po Ge)的例子

});

//注册中间件

app . use(CORS());

app.use(router.routes())。使用(router . allowed methods());

app.listen(3000,()={

console . log(从端口3000开始的应用);

});

在上面的代码中,我们使用了两个中间件@Koa/cors和@koa/router,并创建了一个简单的Koa应用程序。基于以上代码,让注册一个路由来处理指定文件名的在线解压缩。

router . get(/unzip/:name 异步(ctx)={

const文件名=CTX . params . name;

让筛选条目;

尝试{

if(unzipcaches . has(filename)){//先从缓存中获取。

filtered entries=unzipcaches . get(文件名);

}否则{

const ZIP=new stream ZIP . async({ file:path . join(ZIP _ HOME,文件名)});

const entries=await zip . entries();

filteredEntries=Object.values(条目)。映射((条目)={

返回{

名称:entry.name,

尺寸:入口.尺寸,

dir:entry . is目录,

};

});

await zip . close();

UnzipCaches.set(文件名,filtered entries);

}

ctx.body={

状态:成功

条目:已过滤条目,

};

} catch(错误){

ctx.body={

状态:错误

邮件: `在线解压缩${fileName}文件失败`,

};

}

});

在上面的代码中,我们通过ZIP_HOME和fileName获取文件的最终路径,然后使用StreamZip对象执行解压缩操作。为了避免重复的解压缩操作,页面定义了一个UnzipCaches缓存对象来存储解压缩后的文件信息。定义了上述路线后,让验证相应的功能。

请输入ZIP文件名:

在线解压

const file list=document . query selector(#文件列表);

const filename ele=document . query selector(#文件名);

const request=axios.create({

base URL:http://localhost:3000/

超时:10000,

});

异步函数unzipOnline() {

const fileName=fileName ele . value;

如果(!文件名)返回;

const response=await request . get(` unzip/$ { fileName } `);

if(response . data response . data . status===成功) {

const entries=response . data . entries;

let items= # #;

entries.forEach((zipEntry)={

items=`${

zipEntry.name

}`;

});

fileList.innerHTML=items

}

}

上述示例成功运行后的结果如下图所示:

现在我们已经实现了根据文件名对指定的ZIP文件进行解压缩,是否可以在压缩文件中预览指定路径的文件?答案也是可能的。可以使用zip对象提供的entry data(entry:string | zip):promise方法读取指定路径下的文件内容。

router . get(/unzip/:name/entry 异步(ctx)={

const文件名=CTX . params . name;//ZIP压缩文件名

const entry path=CTX . query . path;//文件的路径

尝试{

const ZIP=new stream ZIP . async({ file:path . join(ZIP _ HOME,文件名)});

const entry data=await zip . entry data(entry path);

await zip . close();

ctx.body={

状态:成功

entryData: entryData,

};

} catch(错误){

ctx.body={

状态:错误

邮件: `无法读取${fileName}中的${entryPath}文件,

};

}

});

在上面的代码中,我们通过zip.entryData方法读取指定路径的文件内容,该方法返回一个Buffer对象。当前端接收数据时,也需要将接收到的Buffer对象转换为ArrayBuffer对象,对应的处理方法如下:

函数toArrayBuffer(buf) {

设ab=new array buffer(buf . length);

let view=new uint 8 array(ab);

for(设I=0;i buf.lengthi) {

view[I]=buf[I];

}

返回ab;

}

定义了toArrayBuffer函数后,我们可以通过调用app.js定义的API来实现预览功能,具体代码如下:

异步函数previewZipFile(路径){

const fileName=fileName ele . value;//获取文件名

const response=await request.get(

` unzip/${fileName}/entry?path=${path} `

);

if(response . data response . data . status===成功) {

const { entry data }=response . data;

const entry buffer=toArrayBuffer(entry data . data);

const Blob=new Blob([entry buffer]);

//使用URL.createObjectURL或blob.text()读取文件信息

}

}

因为完整的样本代码内容比较多,Po哥就不放具体代码了。感兴趣的伙伴可以访问以下地址浏览示例代码。

gist.github.com/semlinker/3…

注:以上代码仅供参考,请根据实际业务进行调整。

两种在线解压ZIP文件的方案。在实际项目中,推荐使用服务器解压的方案。这样既能解决浏览器的兼容性问题,又能解决大文件的在线解压问题。同时便于后期扩展支持其他压缩格式。

更多js gzip压缩(jszip读取文件)相关信息请关注本站。