文件上传、下载的总结

news/2024/5/16 16:58:53

最近做了一个后台系统,里面有好多复杂的功能。其中就有上传的功能点,上传的时候,我们要校验上传的文件格式,限制上传的数量,自定义上传接口,可以拖拽上传,可以进行删除、预览,删除之后再次上传的时候会重现计算(这个时候要清除前一次上传的缓存列表)等等,于是就把这块好好总结一下,后面再用到就直接搬就行了。

上传功能

<el-table-columnprop="dataUpload"label="资料上传"width="440"><template #default="{ row }"><el-uploadclass="upload-demo"dragaction="#"multiple:disabled="isEdittable != 'true'":show-file-list="false":http-request="(file) => uploadfile(file, row)":before-upload="(file) => beforeUpload(file, row)":limit="row.docType == 'other' ? 999 : 1":on-exceed="exceedFile":ref="(el) =>setRefs(el,row.id)"><el-icon class="el-icon--upload"><upload-filled/></el-icon><divclass="el-upload__text">拖拽图片到此处,或<em>点此处选择文件</em></div></el-upload></template></el-table-column>
<script setup>
// 获取当前上传文件的html元素
const setRefs = (el, id) => {if (el) {if (!itemRefs.value.some((item) => item.id == id)) {itemRefs.value.push({id: id,el,});}}
};
//上传文件前校验文件类型
const beforeUpload = (file, row) => {// 做上传前的一些校验操作
};
// 超出限制文件数量的钩子函数
const exceedFile = () => {message.warning("只能上传一个文件");
};// 上传文件处理函数
const uploadfile = async (file, row) => {if (file.file.size == 0) {return message.warning("文件内容为空,无法上传");}form.set("file", file.file);form.set("type", row.type);form.set("id", row.id);form.set("docType", row.docType);const loading = loading.service({fullscreen: true,background: "rgba(0,0,0,0.7)",text: "文件上传中",});try {const res = await API.upload(form);if (res.data.code === "000000") {row.files.push({name: res.data.name,id: res.data.id,nailid: res.data.nailid,nailid: res.data.nailid,});loading.close();message.success("文件上传成功");} else {message.error(res.data.message);}} catch (error) {loading.close();message.error("文件上传失败请重试");} finally {loading.close();if (itemRefs.value.length > 0) {itemRefs.value.forEach((item) => {if (item.id == row.recordItemId) {item.el.clearFiles();}});}}
};
</script>

首先我用的ui组件是elementPlus,所以标签名是el-upload;

1、实现拖拽

如果要实现拖拽功能,需要给el-upload标签加上drag属性;

2、实现多选

如果要实现上传时多选文件的功能,需要给el-upload标签加上multiple属性;

3、控制是否可以编辑的功能

如果要实现是否可以上传,需要给el-upload标签加上disabled属性;

4、实现自定义上传操作功能

如果要实现自定义上传操作(自己写函数,并定义上传接口),需要给el-upload标签加上http-request属性,并赋予它对应的方法;

5、实现上传之后的校验操作功能

如果要实现上传前做校验,需要给el-upload标签加上before-upload属性,并赋予它对应的方法;

6、实现上传时限制的上传文件数量

如果要实现上传时限制上传的文件数量,需要给el-upload标签加上limit属性;

7、实现上传时当超出限制时,执行的钩子函数

如果要实现上传时超出限制上传的文件数量时,,需要给el-upload标签加上on-exceed属性,加上对应的钩子函数即可;

8、如果要获取到这个上传文件这个元素,需要加上ref

如果要获取上传文件的这个html元素,需要加上ref这个属性,但是因为上传文件el-upload这个元素是相当于v-for这样生成的,所以会获取到许多el-upload元素,这个时候需要有唯一的id和对应的el-upload元素来一一对应,所以会有一个id来对应;

下载功能

对于下载,后端返回的都是一个文件流,所以要对文件流做处理;

// 处理下载文件的方法
function downLoadXls(res) {const fileNames = res.headers["content-disposition"];if (fileNames) {//解码const fileName = decodeURIComponent(fileNames.match(/=(.*)$/)[1]);// 处理返回的文件流const content = res.data;const blob = new Blob([content], {type: "application/octet-stream; charset=utf-8",});if ("download" in document.createElement("a")) {//非IE下载const a = document.createElement("a"); //创建一个a标签a.download = fileName; //指定文件名称a.style.display = "none"; //页面隐藏a.href = URL.createObjectURL(blob); // href用于下载地址document.body.appendChild(a); //插到页面上a.click(); //通过点击触发URL.revokeObjectURL(a.href); //释放URL 对象document.body.removeChild(a); //删掉a标签} else {//IE10 + 下载navigator.msSaveBlob(blob, fileName);}}
}

http://www.mrgr.cn/p/86617374

相关文章

【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Pythonmatlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

uniapp使用uni-swipe-action后右侧多了小于1px的间隙

问题&#xff1a;uniapp使用uni-swipe-action后右侧多了小于1px的间隙。且在真机上没有问题&#xff0c;但是在微信开发者工具中有问题。 代码如下&#xff1a;在滑动滑块或者点击这个区域时&#xff0c;就会出现问题。 <scroll-view :scroll-y"true" :style&quo…

【Golang 接口自动化08】使用标准库httptest完成HTTP请求的Mock测试

目录 前言 http包的HandleFunc函数 http.Request/http.ResponseWriter httptest 定义被测接口 测试代码 测试执行 总结 资料获取方法 前言 Mock是一个做自动化测试永远绕不过去的话题。本文主要介绍使用标准库net/http/httptest完成HTTP请求的Mock的测试方法。 可能有…

window下运行sh脚本/Linux命令

安装Git 首先找到git安装官方网址&#xff0c;Git的官方网址如下所示 https://git-scm.com/download/win 选择合适的Git版本安装即可。 一般一直点击install即可&#xff0c;注意环境变量的environment path的复选框点击。具体操作以及成果标志如下博客所示。 Windows 命令…

【C++】多态的实现及其底层原理

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 我的gitee&#xff1a;gitee仓库 分享一句喜欢的话&#xff1a;热烈的火焰&#xff0c;冰封在最沉默的火山深处。 文章目录 前言一、什么是多态&#xff1f;二、多态的构成条件2.1什么是虚函数&#xff1f;2.2虚函数的重写2…

微服务划分的原则

微服务的划分 微服务的划分要保证的原则 单一职责原则 1、耦合性也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密&#xff0c;其耦合性就越强&#xff0c;模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及…

重生之我要学C++第四天

这篇文章的主要内容是类的默认成员函数。如果对大家有用的话&#xff0c;希望大家三连支持&#xff0c;博主会继续努力&#xff01; 目录 一.类的默认成员函数 二.构造函数 三.析构函数 四.拷贝构造函数 五.运算符重载 一.类的默认成员函数 如果一个类中什么成员都没有&…

揭秘!头条百科词条创建全过程及技巧解析

随着互联网时代的到来&#xff0c;人们获取信息的方式越来越便捷。作为国内领先的信息平台&#xff0c;头条百科成为了很多人查阅知识的首选。然而&#xff0c;如何在头条上创建百科词条&#xff0c;让更多人了解和熟知自己呢&#xff1f;本文伯乐网络传媒将为您揭开这个谜团&a…

C++模拟操作系统睡眠机制

在系统中定义一个变量bHiberable&#xff0c;如果是3分钟内休眠&#xff0c;那么每隔3分钟检测一次这个变量&#xff0c;如果为真&#xff0c;则进入睡眠&#xff0c;如果是假&#xff0c;就把这个标志设置为真。继续等待和检测。 程序阻止操作系统休眠的办法&#xff1a;操作…

基于多任务学习卷积神经网络的皮肤损伤联合分割与分类

文章目录 Joint segmentation and classification of skin lesions via a multi-task learning convolutional neural network摘要本文方法实验结果 Joint segmentation and classification of skin lesions via a multi-task learning convolutional neural network 摘要 在…

【运维】hive 终端突然不能使用:Hive Schema version does not match metastore‘s schema version

文章目录 一. 问题描述二. 常规排查1. 元数据库2. hive-site.xml相关meta连接信息检查 三. 正解 一. 问题描述 进入hive终端&#xff0c;执行如下命令报错&#xff1a; hive> show tables; FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: …

flutter 打包iOS安装包

flutter iOS Xcode打包并导出ipa文件安装包 1、 Xcode配置 1、 启动打包 1、 等待打包 1、 打包完成、准备导出ipa 1、 选择模式 1、 选择配置文件 1、 导出 1、 选择导出位置 1、 得到ipa

sql server导入.back文件

使用SQL server官方的连接工具 SQL server Management studio 有两种方式 第一种&#xff1a; 前提是&#xff0c;提前知道数据库名称&#xff0c;建好数据库 以数据库 TEST为例子 右键数据库选型&#xff0c;选择新建数据库 输入数据库名字&#xff0c;点击确定 创建完成之…

Mock-MOCO使用过程

一、jar包下载&#xff1a;https://github.com/dreamhead/moco 二、准备mock的json文件 data.json内容&#xff1a; ####GET请求 [{"description": "response使用Content-Type为charsetGBK编码格式来查看返回信息为中文的内容","request": {&q…

1230. K倍区间(超级详细,小白入!!!)

输入样例&#xff1a; 5 2 1 2 3 4 5输出样例&#xff1a; 6 这个题看到区间两个字&#xff0c;两眼一瞪可能就和前缀和差分有关 做题思路&#xff1a; 通过记录每个[1,r]区间值的和,看它前面是否出现过一个[1,l](l<r),使得[l,r]区间的值能除尽k 有同学就好奇&#xff0c;…

通过RPM方式安装,升级,卸载,以及配置使用MySQL

通过RPM方式安装&#xff0c;升级&#xff0c;卸载&#xff0c;以及配置使用MySQL 一、下载 MySQL是一种开源的关系数据库管理系统&#xff0c;被广泛应用于各种业务应用中。本文将讲解如何下载和安装MySQL的rpm安装包。 下载rmp安装包有多种方式&#xff1a; 1、官网下载 …

视频内存过大如何压缩变小?这个压缩方法了解一下

在日常生活中&#xff0c;不管是日常随手拍的视频还是在工作中遇到的视频文件&#xff0c;在编辑处理的时候&#xff0c;如果视频的内存过大&#xff0c;不仅会占用很大的内存&#xff0c;在传送的时候也会花费很长时间&#xff0c;这时候将视频给压缩一下就可以很好的解决这一…

STM32入门学习之外部中断

1.STM32的IO口可以作为外部中断输入口。本文通过按键按下作为外部中断的输入&#xff0c;点亮LED灯。在STM32的19个外部中断中&#xff0c;0-15为外部IO口的中断输入口。STM32的引脚分别对应着0-15的外部中断线。比如&#xff0c;外部中断线0对应着GPIOA.0-GPIOG.0&#xff0c;…

论文笔记:Fine-Grained Urban Flow Prediction

2021 WWW 1 intro 细粒度城市流量预测 两个挑战 细粒度数据中观察到的网格间的转移动态使得预测变得更加复杂 需要在全局范围内捕获网格单元之间的空间依赖性单独学习外部因素&#xff08;例如天气、POI、路段信息等&#xff09;对大量网格单元的影响非常具有挑战性——>论…

【客户案例】云联壹云助力某保险公司搭建公有云费用管理平台

客户介绍 客户成立于 1996 年 11 月&#xff0c;现已拥有逾 2000 名员工和 12000 名营销员&#xff0c;为 280 万客户提供专业的金融保险服务。在上海、北京、广东、浙江、江苏、四川、山东、福建、重庆、辽宁、天津、湖北、河北、湖南和陕西等地的 50 多个城市稳步发展&#…