使用Vue3在浏览器端进行zip文件压缩
在前端开发中,我们时常需要处理文件上传和下载的功能。有时,用户可能希望将多个文件打包成一个zip文件以便于下载。今天,我将分享一个使用Vue3和JSZip库在浏览器端实现zip文件压缩的示例。
首先,我们需要安装JSZip库。如果你使用的是npm,可以通过以下命令进行安装:
npm install jszip
在Vue3组件中,我们可以定义一个响应式引用fileDatas来存储用户上传的文件信息。同时,我们还需要几个其他的引用来控制压缩选项和进度。
<script lang="ts" setup>
import { ref } from 'vue'
import JSZip from 'jszip'
import { saveAs } from 'file-saver' // 注意这里我假设你已经有file-saver库了
interface FileData {
file: File
fileName: string
}
const fileDatas = ref<FileData[]>([])
const isCompress = ref(false) // 是否启用压缩
const compressionLevel = ref(6) // 压缩级别
const packagingPercentage = ref(0) // 压缩进度
// 文件上传处理函数
const fileUpload = (file: File) => {
fileDatas.value.push({
file,
fileName: file.name
})
}
// 打包为zip文件
const packageAsZip = async () => {
packagingPercentage.value = 0
const zip = new JSZip()
fileDatas.value.forEach((fileData) => {
zip.file(fileData.fileName, fileData.file)
packagingPercentage.value += 100 / fileDatas.value.length // 简化进度计算
})
let content: Blob
if (isCompress.value) {
content = await zip.generateAsync({
type: 'blob',
compression: 'DEFLATE',
compressionOptions: { level: compressionLevel.value }
})
} else {
content = await zip.generateAsync({ type: 'blob' })
}
saveAs(content, 'compressed_files.zip')
}
</script>
<template>
<div>
<!-- 假设你有一个文件上传组件CommonFileUploadWithDirectory -->
<CommonFileUploadWithDirectory @upload="fileUpload" />
<!-- 压缩按钮 -->
<button @click="packageAsZip">压缩为ZIP</button>
<!-- 文件列表展示 -->
<div v-if="fileDatas.length > 0" class="file-list">
<div v-for="(fileData, index) in fileDatas" :key="index" class="file-list-item">
<!-- 假设你有一个删除按钮组件,这里用了一个简单的删除逻辑 -->
<button @click="fileDatas.splice(index, 1)">删除</button>
<span>{{ fileData.fileName }}</span>
</div>
</div>
</div>
</template>
<style scoped>
/* 样式省略 */
</style>
在上面的代码中,我们定义了一个文件上传处理函数fileUpload,每当用户上传一个文件时,就将文件信息添加到fileDatas数组中。我们还定义了一个packageAsZip函数,该函数会遍历fileDatas数组中的每个文件,并使用JSZip将它们添加到zip文件中。然后,根据isCompress的值决定是否启用压缩,并生成一个Blob对象。最后,使用file-saver库的saveAs函数将Blob对象保存为zip文件。
注意,我在计算压缩进度时进行了简化,直接假设每个文件占据相等的进度。在实际应用中,你可能需要根据文件的大小或压缩的实际情况来更精确地计算进度。
实际案例:https://anttoolbox.cn/tools/zip,这里我参与了开发~~~
使用Vue3在浏览器端进行zip文件压缩的更多相关文章
- angulaijs中的ng-upload-file与阿里云oss服务的结合,实现在浏览器端上传文件到阿里云(速度可以达到1.5M)
2015-10-26 angularjs结合aliyun浏览器端oos文件上传加临时身份验证例子 在服务端获取sts 源码: public class StsServiceSample { // 目前 ...
- nginx优化:使用expires在浏览器端缓存静态文件
一,nginx中expires指令的作用 网站的图片等静态文件一旦发布,通常很少改动, 为了减小对服务器请求的压力,提高用户浏览速度, 我们可以设置nginx中的expires, 使用户访问一次后,将 ...
- Zip文件压缩(加密||非加密||压缩指定目录||压缩目录下的单个文件||根据路径压缩||根据流压缩)
1.写入Excel,并加密压缩.不保存文件 String dcxh = String.format("%03d", keyValue); String folderFileName ...
- C#执行zip文件压缩的几种方法及我遇到的坑总结
工作项目中需要用到zip压缩解压缩文件,一开始看上了Ionic.Zip.dll这个类库,操作方便,写法简单 对应有个ziphelper类 using Ionic.Zip; public static ...
- zip文件压缩(转)
zip文件结构 上面中的每一行都是一个条目,zip文件就是由一个或者多个条目组成. 条目在Java中对应ZipEntry类 创建zip压缩文件 ...
- 使用commons-compress操作zip文件(压缩和解压缩)
http://www.cnblogs.com/luxh/archive/2012/06/28/2568758.html Apache Commons Compress是一个压缩.解压缩文件的类库. 可 ...
- python zip文件压缩和解压
压缩 import shutil zipOutputName = "1234" # 输出1234.zip fileType = "zip" # 文件类型zip ...
- ZIP文件压缩和解压
最近要做一个文件交互,上传和下载, 都是zip压缩文件,所以研究了下,写了如下的示例 注意引用 ICSharpCode.SharpZipLib.dll 文件 该dll文件可以到官方网站去下载, 我这 ...
- zip文件压缩
zip文件结构 上面中的每一行都是一个条目,zip文件就是由一个或者多个条目组成. 条目在Java中对应ZipEntry类 创建zip压缩文件 知 ...
- 利用Java进行zip文件压缩与解压缩
摘自: https://www.cnblogs.com/alphajuns/p/12442315.html 工具类: package com.alphajuns.util; import java.i ...
随机推荐
- js判断对象数组等是否为空
//是否为空 /** * null undefined NaN false " " {} [] 为空 * 为空 true 不为空 false * @param {*} value ...
- 关于FTP文件传输协议说明,带你了解更详情的文件传输协议
Internet和其他网络上的人与设备之间的通信使用协议进行.您可以说协议定义了对话规则:谁必须在何时发送哪些信息?如果数据没有到达接收者,会发生什么?您如何保护转帐免受错误和犯规?每当我们使用Int ...
- KingbaseES V8R3 集群运维系列 -- failover切换后集群自动恢复
案例说明: KingbaseES V8R3集群默认在触发failover切换后,为保证数据安全,原主库需要通过人工介入后,恢复为新的备库加入到集群.在无人值守的现场环境,需要在触发failover ...
- List和ObservableCollection的转换
1.我们后台查询全部List数据的时候,前台需要ObservableCollection展示 这个时候List需要转换成ObservableCollection public static Obser ...
- RabbitMQ 6种模式的练习,以及知识梳理
常用的模式有Simple.Work.Fanout.Direct.Topic.Headers,可以通过设置交换机类型和配置参数来实现各个模式 简单模式(Simple) 工作模式(Work) 工作模式是考 ...
- #线段树,约数#洛谷 3889 [GDOI2014]吃
题目 有一个长度为\(n\)的数列,现在有\(m\)组询问每次给出区间\([l,r]\),查询 \[\max_{i,j=1}^n\{gcd(a_i,a_j)[(i<l或i>r)且l\leq ...
- OpenCV一句话将彩色图片(Mat)转换为灰度
auto in_gray=cv::imdecode(in, cv::IMREAD_GRAYSCALE);
- 全面的开发者文档和用户目标解析:API 文档指南和开发者旅程
开发者文档 开发者文档,也称为 API 文档,是一种专门针对软件开发人员的技术写作形式.这种类型的文档通常包括 API 的技术规范.代码注释.软件设计和架构以及软件开发中涉及的其他详细技术描述.开发者 ...
- 如何采用VuePress构建文档网站
作者:倾城 博客: https://www.codingbrick.com 寄语:当你意识到面子不重要时,你才算个真正的成年人. 在建设博客的初期,我采用GitBook构建了编码专家的专栏系统.Git ...
- spark 计算前后两条记录之间的差(diff),时间差等
有时候会遇到这样的场景:有一个datafram,我们需要计算同一组对象中,前后两条记录之间的差值,此处并不仅限于时间,还可以是其他的数据类型 需要用到两个工具:spark窗口函数Window对对象分组 ...