vue使用elementUI的upload上传文件封装
这篇文章的目的
将文件上传的方法封装一下,供大家统一调用,
话不多说,直接上代码
upload 核心参数说明
- action 上传的地址
- accept 接受上传的文件类型
- multiple 是否开启多文件上传模式
- limit 限制上传个数
- fileList 文件列表
- disabled 是否禁用
upload 核心方法说明
- before-upload 上传文件之前的钩子.
- on-success 上传成功的钩子函数
- on-error 文件上传失败时的钩子
- on-exceed 文件超出个数限制时的钩子
- on-remove 文件列表移除文件时的钩子
- on-preview 点击文件列表中已上传的文件时的钩子.
- on-progress 文件上传时的钩子 进度条展示的基础
核心局部代码说明
html中
插槽的使用
子组件
<slot name="uploadBtn"></slot>
调用上传组件的父组件
<uploadBtn><template v-slot="uploadBtn"><img src='http://test/upload.img'></img></template></uploadBtn>
说明
使用了具名插槽 将上传的按钮放在父组件调用子组件标签的容器中,这样的好处是:随意定制按钮不需要写一堆的条件判断,且可定制上传按钮
js中
office 自动预览的使用
data定义office基础路径
officeOnlineAddress:'https://view.officeapps.live.com/op/view.aspx?src=',
office基础路径拼接文件路径并预览
const preveiewURL = this.officeOnlineAddress + targetwindow.open(preveiewURL)
说明
office基础路径拼接文件路径并用window.open即可实现文件的预览
beforeUpload 上传文件之前的拦截处理
代码
beforeUpload(file) {const { name = '', size } = fileif (size > this.maxSize * 1024 * 1000) {this.$Message.warning(`文件最大仅支持${this.maxSize}M`)return false}if (!this.acceptTypeList.includes(name.split('.').pop())) {this.$Message.warning(`文件格式仅支持${this.acceptTypeList.join(',')}`)return false}},
说明
- 文件大小大于父组件传入的maxSize则拦截并提示
- 文件格式不正确则拦截并提示
- beforeUpload函数体中,如果函数的返回值是false,则终止上传
文件预览的操作
代码
preview (data) {const { url, response = {} } = data || {}let name = data.nameconst downLoadTypeList = this.downLoadTypeListconst preveiwTypeList = this.preveiwTypeListif (!name) {name = ''}const suffixFileType = name.split('.').pop()if (downLoadTypeList.includes(suffixFileType)) {//下载 'doc', 'docx', 'xlsx', 'xls', 'txt' 文件name = name.replace(/&/g, '') // & 不兼容const target = encodeURIComponent(Base64.encode(`${location.origin}/api/abk/web/v1/resource/file?fileId=${url || response.data}&fullfilename=${name}&sid=4AC67ADB4E264AB0A8B899A671072875`))if (this.officePreviewFlag &&this.officeType.includes(suffixFileType)) {// office预览的const preveiewURL = this.officeOnlineAddress + targetwindow.open(preveiewURL)} else {// 非office预览window.open(`https://test/preview/onlinePreview?url=${target}`,'_blank')}} else if (preveiwTypeList.includes(suffixFileType)) {//新窗口打开 预览图片文件window.open('/api/abk/web/v1/resource/file?fileId=' +(url || response.data),'_blank')}},
说明
- 使用 name.split(‘.’).pop() 拿到文件的后缀名
- 根据传入的 downLoadTypeList(需要下载的文件类型)、preveiwTypeList(可以直接预览的文件类型)、officePreviewFlag(office文件类型)以及officePreviewFlag(是否启用office预览)和文件后缀名匹配
- 需要下载的文件类型 根据后端的下载基础路径拼接得到下载地址,并结合windwo.open下载
- 可以直接预览的文件类型 根据后端的预览基础路径拼接得到下载地址,并结合windwo.open 预览
- office文件类并且启用了office预览直接调用office预览路径(https://view.officeapps.live.com/op/view.aspx?src=)
进度条处理
html
<el-progress v-if="showProcessFlag&&processFlag" :percentage="loadProcess"></el-progress>
js
onProgressFn(event, file, fileList){this.processFlag = truethis.loadProcess = event.percent.toFixed(2)if(this.loadProcess>=100){this.loadProcess= 100this.$nextTick(()=>{this.processFlag = false})}}
说明
- 用户启用了进度条(showProcessFlag为true) 并且 processFlag的值为true(当进度条的值存在并且小于100时)
- 当进度大于等于100时需要隐藏进度条,为了保险起见,此处加了 $nextTick,当然了setTimeout(()=>{},0)也可以
<template><div><!--action="/api/abk/web/v1/resource/file" --><el-upload:action="actionUrl"style="width: 100%":on-success="(response, file) => successUpload(response, file)":on-error="errorUpload":accept="acceptTypeList.join('|')":before-upload="beforeUpload":multiple="multiple":limit="maxLimit":on-exceed="handleExceed":file-list="fileList":disabled="disabledFlag":on-remove="(file, fileList) => removeFile(file, fileList)":on-preview="(file) => preview(file)":on-progress="(event, file, fileList)=>onProgressFn(event, file, fileList)"><!-- 上传的按钮 或者 icon 通过具名插槽的方式 --><slot name="uploadBtn"></slot></el-upload><el-progress v-if="showProcessFlag&&processFlag" :percentage="loadProcess"></el-progress></div>
</template><script>
export default {name: 'UploadFile',props: {actionUrl: {//上传的地址type: String,default: '',},acceptTypeList: {//接受的文件类型type: Array,default: () => {return []// ['doc', 'docx', 'xlsx', 'xls', 'txt', 'pdf','jpg','jpeg','png','zip,'rar']},},multiple: {//是否开启多图上传type: Boolean,default: false,},maxLimit: {// 最大上传个数限制type: Number | String,default: 1,},maxSize:{// 文件上传的最大体积 Mtype: Number | String,default: 4,},disabledFlag: {//是否禁用type: Boolean,default: false,},fileList: {//文件列表type: Array,default: () => {return []},},extraData: {}, //上传时的额外参数 如 name等/* {name:'12321'}*/dragFlag: {type: Boolean,default: true, //是否启用拖拽上传 此处默认启用 element 官方默认是 不启用的},downLoadTypeList: {//需要下载的文件类型type: Array,default: () => {return ['doc', 'docx', 'xlsx', 'xls', 'txt']},},preveiwTypeList: {//需要预览的文件类型type: Array,default: () => {return ['pdf', 'jpg', 'jpeg', 'png']},},officePreviewFlag: {//是否启用office在线预览type: Boolean,default: false,},showProcessFlag:{//是否显示进度条type: Boolean,default: false,},},// office预览// https://view.officeapps.live.com/op/view.aspx?src=// https://view.officeapps.live.com/op/view.aspx?src=文档地址//data() {return {officeOnlineAddress:'https://view.officeapps.live.com/op/view.aspx?src=',officeType: ['doc', 'docx', 'xlsx', 'xls'],processFlag:false,//是否显示进度条loadProcess:0//进度条的刻度值}},mounted() {},methods: {// 上传图片 成功successUpload(response, file) {if (response.rt.status === 200) {this.fileList.push({url: response.data,name: file.name,})} else {this.$Message.info(response.data)}},errorUpload(res) {this.$Message.info('上传失败请重试!')},beforeUpload(file) {const { name = '', size } = fileif (size > this.maxSize * 1024 * 1000) {this.$Message.warning(`文件最大仅支持${this.maxSize}M`)return false}if (!this.acceptTypeList.includes(name.split('.').pop())) {this.$Message.warning(`文件格式仅支持${this.acceptTypeList.join(',')}`)return false}},handleExceed(files, fileList) {this.$Message.warning(`当前限制选择 10 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`)},// 移除文件removeFile(file, data) {console.log(file, data)this.fileList = data},// 预览preview (data) {const { url, response = {} } = data || {}let name = data.nameconst downLoadTypeList = this.downLoadTypeListconst preveiwTypeList = this.preveiwTypeListif (!name) {name = ''}const suffixFileType = name.split('.').pop()if (downLoadTypeList.includes(suffixFileType)) {//预览 'doc', 'docx', 'xlsx', 'xls', 'txt' 文件name = name.replace(/&/g, '') // & 不兼容const target = encodeURIComponent(Base64.encode(`${location.origin}/api/abk/web/v1/resource/file?fileId=${url || response.data}&fullfilename=${name}&sid=4AC67ADB4E264AB0A8B899A671072875`))if (this.officePreviewFlag &&this.officeType.includes(suffixFileType)) {// office预览的const preveiewURL = this.officeOnlineAddress + targetwindow.open(preveiewURL)} else {// 非office预览window.open(`https://test/preview/onlinePreview?url=${target}`,'_blank')}} else if (preveiwTypeList.includes(suffixFileType)) {//新窗口打开 预览图片文件window.open('/api/abk/web/v1/resource/file?fileId=' +(url || response.data),'_blank')}},onProgressFn(event, file, fileList){this.processFlag = truethis.loadProcess = event.percent.toFixed(2)if(this.loadProcess>=100){this.loadProcess= 100this.$nextTick(()=>{this.processFlag = false})}}},
}
</script><style lang="scss" scoped>
</style>List){this.processFlag = truethis.loadProcess = event.percent.toFixed(2)if(this.loadProcess>=100){this.loadProcess= 100this.$nextTick(()=>{this.processFlag = false})}}},
}
</script><style lang="scss" scoped>
</style>
相关文章:
vue使用elementUI的upload上传文件封装
这篇文章的目的 将文件上传的方法封装一下,供大家统一调用, 话不多说,直接上代码 upload 核心参数说明 action 上传的地址accept 接受上传的文件类型multiple 是否开启多文件上传模式limit 限制上传个数fileList 文件列表disabled 是否禁用 upload 核心方…...

cenos自动启动tomcat
首先创建一个脚本 关闭tomcat 等待2分钟 启动tomcat 并且把日志输出在 /usr/local/tomcat/tomcatchognqi.log #!/bin/bashexport JAVA_HOME/usr/local/jdk/jdk1.8.0_211 export JRE_HOME$JAVA_HOME/jre# 日志文件路径和文件名 LOG_FILE"/usr/local/tomcat/tomcatchognqi.…...

OSI模型与数据的封装
1、OSI模型 上层|| 七层模型 四层模型|| 应用层| 表示层 应用层 http/ftp/ssh/ftps| 会话层 -----------------------------------------------------------------------| 传输层 传输层 tcp/udp ------------------------------…...

【李沐深度学习笔记】数据操作
本课观看地址 数据操作p1 N维数组样例 N维数组是机器学习和神经网络的主要数据结构 1-d向量就是样本的各特征抽象成一个向量;2-d矩阵的每一行是一个样本,每一行都是一个样本的特征向量 3-d可以表示RGB图片,RGB图像是一个三维数组ÿ…...

【蓝桥杯选拔赛真题61】Scratch小猫照镜子 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析
目录 scratch小猫照镜子 一、题目要求 编程实现 二、案例分析 1、角色分析...
vue3将页面导出成PDF文件(完美解决图片、表格内容分割问题)
vue3将页面导出成PDF文件(完美解决图片、表格内容分割问题) 1、安装依赖2、在utils中创建htmlToPDF.js文件3、在vue中引入并使用 1、安装依赖 npm install --save html2canvas // 页面转图片 npm install jspdf --save // 图片转pdf2、在utils中创建h…...

软件测试:黑盒测试用例的四种设计方法
一、输入域测试用例设计方法 输入域测试法是一种综合考虑了等价类划分、边界值分析等方法的综合方法,针对输入域测试法中可能出现的各种情况,输入域测试法主要考虑三个方面: (1)极端测试(ExtremalTesting),要求在输入域中选择测…...

数据库开发-MySQL基础DQL和多表设计
1. 数据库操作-DQL DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。 1.1 介绍 查询关键字:SELECT 查询操作是所有SQL语句当中最为常见,也是最为重要的操作。在一个正常的业务系统中,查询操作的使…...

PowerDesigner 逆向工程以及IDEA中UML插件
1、MySQL数据库连接(JDBC方式) 1.1 新建一个pdm,dbms选择mysql 1.2 Database - Connect 选择数据库连接 1.3 配置连接信息 数据库连接这里是通过一个配置文件来获取连接信息的,首次的话因为没有,所以我们需要选择…...

企业架构LNMP学习笔记56
MongoDB数据类型操作:CURD 1、添加数据: mongodb里存储数据的格式文档形式,以bson格式的文档形式。 创建数据库: > use tp5shop switched to db tp5shop > db.getName() tp5shop使用切换库,不存在自动创建&am…...

[Linux入门]---搭建Linux环境
1.Linux环境的搭建方式 使用Linux操作系统的三种途径: 1.直接安装在物理机上,但是由于 Linux 桌面使用起来非常不友好,不推荐。 2.使用虚拟机软件,将 Linux 搭建在虚拟机上,但是由于当前的虚拟机软件(如 VMWare 之类的…...

性能测试知多少---性能分析与调优的原理
最近一直纠结性能分析与调优如何下手,先从硬件开始,还是先从代码或数据库。从操作系统(CPU调度,内存管理,进程调度,磁盘I/O)、网络、协议(HTTP, TCP/IP )&…...

“对象创建”模式
通过“对象创建”模式绕开new,来避免对象创建 (new) 过程中所导致的紧耦合(依赖具体类)从而支持对象创建的稳定。它是接口抽象之后的第一步工作。 典型模式 Factory MethodAbstract FactoryPrototypeBuilder Factory Method 动机 (Motivation) 在软件系统中&am…...

ipad手写笔有必要买吗?好用的平板触控笔
众所周知,随着Apple pencil的出现,市面上出现越来越多平替电容笔的出现,无论是价格和功能,几乎都很接近。很多小伙伴不知如何下手,不知道如何从众多品牌中挑选出适合自己的电容笔,今天我为大家总结一下网上…...

OpenGL ES视频特效开发参考Shadertoy参数详解参考Godot文档
今天一个大厂的学员过来问shadertoy上一些参数的问题,因为我之前用过一段时间Godot引擎, 我清晰记得Godot官方文档有明确的解释,所以整理下发给做特效的同学。 Shadertoy是一个网站,它方便用户编写片段着色器并创造出纯粹的魔法。…...

java:逆序排序的三种方法
// 逆序第一种方法 public static void main(String[] args) {int arr[] {11, 22, 33, 44, 55, 66};for (int i arr.length-1; i > 0; i--) {System.out.print("\t"arr[i]);}}缺点:这个是直接逆转,如果里面是随机数没办法比较 逆序第二种…...

pgsql操作json类型
目录 一、表结构 二、实体类 三、json处理器 四、配置文件 五、josn数据 1、插入 2、查找 一、表结构 CREATE TABLE "public"."pg_user" ("id" int8 NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 MINVALUE 1 MAXVALUE 92233720…...

Thinkphp6 配置并使用redis图文详解 小皮面板
这篇文章主要介绍了Thinkphp6 配置并使用redis的方法,结合实例形式详细分析了Redis的安装、配置以及thinkphp6操作Redis的基本技巧,需要的朋友可以参考下 一、安装redis ThinkPHP内置支持的缓存类型包括file、memcache、wincache、sqlite。ThinkPHP默认使用自带的采用think\Ca…...

模拟实现链式二叉树及其结构学习——【数据结构】
W...Y的主页 😊 代码仓库分享 💕 之前我们实现了用顺序表完成二叉树(也就是堆),顺序二叉树的实际作用就是解决堆排序以及Topk问题。 今天我们要学习的内容是链式二叉树,并且实现链式二叉树,这篇博客与递归息息相关&a…...
基于go版本的LoraWAN Server 的470MHz频段的设置
一、参考链接 如果您已经基于最新版本的LoraWAN Server(go 版本)的环境,搭建好了服务器的环境,但尚未进行参数设置(此处以470MHz频段设置为例),可以参考如下链接进行设置: LoraWAN…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...