直接在前端做 zip 压缩/解压

简介: 前段时间研究前端是如何解析 excel 表格的时候了解到 jszip 这个库,可以直接在前端对 zip 包进行压缩和解压缩,今天稍微水一篇。

前段时间研究前端是如何解析 excel 表格的时候了解到 jszip 这个库,可以直接在前端对 zip 包进行压缩和解压缩,今天稍微水一篇。

使用

安装就不说了,直接 npm install jszip 即可。

读取本地文件

要读取本地 zip 文件,我们只需要使用 loadAsync 传入文件对象即可,先创建一个 file input 用于选择文件:

<input type="file" id="file" name="file" />
复制代码

然后在文件选择后我们调用 loadAsync 来读取文件内容:

document.querySelector('#file').addEventListener('change', async e => {
    const file = e.target.files[0];
    if (!file) return;
    const zip = await JSZip.loadAsync(file);
});
复制代码

读取完成后我们可以到返回的 zip 对象中的 files 属性中看到所有的压缩包中的文件:

const zip = {
    files: {
        'Hello.txt': ZipObject,
        'images/': ZipObject,
        'images/smile.gif': ZipObject
    }
};
复制代码

所有的文件、文件夹都会按照路径挂在 files 中,而 ZipObject 中则包含了该文件压缩信息,但是要注意,此时该文件的内容还是被压缩的,所以我们不能将其当作一般的 file 文件来使用,使用前我们还需要二次转换,比如我们要读取上面的 Hello.txt 中的内容,我们可以先讲其转换为 blob 对象后,再使用 fileReader 读取:

const txtBlob = await zip.files['Hello.txt'].async('blob');
const fileReader = new FileReader();
file.onload = r => console.log(r.target.result);
reader.readAsText(f);
// log: Hello World\n
复制代码

当然,我们也可以直接使用内置的方法直接转为 string

const text = await zip.files['Hello.txt'].async('string');
复制代码

在浏览器端 jszip 支持以下几种数据类型:

  • array
  • arraybuffer
  • base64
  • blob
  • string
  • uint8array

而在 node 端,jszip 还支持 nodebuffernodestream

读取远端文件

除了读取本地文件外,jszip 还支持读取远程的 zip 文件:

new Promise(function (resolve, reject) {
    JSZipUtils.getBinaryContent('/jszip/test/ref/text.zip', function (err, data) {
        if (err) {
            reject(err);
        } else {
            resolve(data);
        }
    });
})
    .then(JSZip.loadAsync)
    .then(function (zip) {
        return zip.file('Hello.txt').async('string');
    });
复制代码

这里使用了 zip.file 方法来读取文件,和上面使用 files 读取是相通的。通过官方提供的 JSZipUtils.getBinaryContent 函数可以直接获取远端文件进行读取,封装的很便利。

压缩文件

除了上面说到的解压文件外,jszip 还支持直接在浏览器端对文件进行压缩,首先我们要先说实例化一个 zip 对象:

const zip = new JSZip();
zip.file('Hello.txt', 'Hello world\n');
复制代码

通过 file 向对象中加入文件,然后就可以通过 generateAsync 来生成 blob 文件:

const blob = await zip.generateAsync({ type: 'blob' });
复制代码

生成后即可进行文件下载,可直接通过 FileSaversaveAs 下载:

saveAs(blob, 'hello.zip');
复制代码

emm,这封装的,真香。

zip 压缩解压原理

再浅显的聊几句关于压缩解压原理。由于个人对压缩解压算法没什么研究,这里也不打算聊太多的深度的内容,只是个人去了解了一下相关的内容,这里很浅显的说一下:zip 压缩主要是将连续的字符进行合并来完成压缩的,可以简单的认为比如遇到 44444999999 这样的字符, zip 压缩会将其压缩为 4,5,9,6 这个的形式,从而达到压缩的目的。当然,实际算法比这要复杂很多,有兴趣的可以看下这两篇文:

通过原理就可以看出,其实压缩解压没有什么 web 盲区,只是算法复杂,但是用到的能力比较基础,只是能将文件数据取出,就可以进行解析,所以前端确实是可以实现的。而因为前端压缩解压的场景太少了,这也是很少有人知道前端能做压缩解压的原因,压根没往这方面想过。🤦‍♂️

使用场景

实际业务需求中其实很少会用到前端来压缩或者解压缩的场景。个人能想到的实际使用场景就以下几个:

  • 在线压缩解压的工具网站
  • 解析 excel 文件等其它依赖于 zip 压缩的文件
  • 工具类网站上传 zip 包资源解析使用

总结

jszip 总体感觉上来说 API 设计的还是非常不错的,使用简单,没有那么多麻烦的事情,加上使用 Promise,配合 async/await 真是香。如果以后遇到需要的场景时不失为一个好选择。

相关文章
|
前端开发 JavaScript Java
前端——使用RequireJS的r.js打包压缩模块
前端——使用RequireJS的r.js打包压缩模块
|
编解码 Rust 前端开发
纯前端也能实现在线GIF压缩
纯前端也能实现在线GIF压缩
|
编解码 移动开发 前端开发
前端图像处理和压缩
前端图像处理和压缩
731 0
|
前端开发 开发者
前端工程化的前端性能的性能优化方案的网络层面优化之压缩
压缩是一种非常重要的前端性能优化方案,因为它可以在不同的环境中提高网页的响应速度和可接受性。
168 0
|
移动开发 前端开发 PHP
h5前端图片压缩直传到OSS,压缩用localResizeIMG插件
前段时间参与了一个H5项目,里边有个需求是用户上传图片。当时的方案是前端先调用微信的JSSDK选择图片并上传,然后再从后端下载到服务器上。
3780 0
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
1001 14
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
317 0
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
446 6
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
574 1

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
  • 2
    前端工程化演进之路:从手工作坊到AI驱动的智能化开发
  • 3
    Vue 3 + TypeScript 现代前端开发最佳实践(2025版指南)
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
  • 6
    实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距