Vue+ElementUI+Axios实现携带参数的文件上传(数据校验+进度条)

Vue+ElementUI+Axios实现携带参数的文件上传(数据校验+进度条)

可以实现对上传文件的类型,大小进行数据校验,以及对上传文件所要携带的数据也进行的校验,也有文件上传进度的进度条。

一、Vue 结构部分

弹窗显示(文件上传框+文本框+单选按钮)

<template><!-- 控制子组件显示还是隐藏: :visible.sync="isShow"  --><div><!-- 弹窗 --><el-dialog width="30%" :modal="true" title="新增资源" :modal-append-to-body="true" :visible.sync="isShowAdd":close-on-click-modal="false" :close-on-press-escape='false' :show-close="false" center><!-- 需要上传的表单::model 和 ref 的值尽量保持一致,ref在的值在提交数据时进行对提交的数据进行校验 --><el-form :model="ResourceInfo" ref="ResourceInfo" :rules="rules"  size="small" label-width="120px" label-position="right" key="1" :hide-required-asterisk="true"><el-form-item label="资源" ><!-- 文件上传:http-request这里用来获取到要上传的文件。limit限制文件个数。on-exceed:用来校验文件个数 ,before-remove:删除上传列表时提示用户--><el-uploadclass="upload-demo" action="" ref="upload"  :http-request="httprequest" :limit=1 :drag="true" :on-exceed="handleExceed" :before-remove="beforeRemove"><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击选择文件</em></div></el-upload></el-form-item><!-- 文本框用来填写要上传一个参数,这里是为了给文件打标签 --><el-form-item prop="tag"  label="标签"><el-input v-model="ResourceInfo.tag" ref="tag" maxlength="30" autocomplete="off"  placeholder="如:风景/天空"></el-input></el-form-item><!-- 单选框,也是文件的一个参数 --><el-form-item prop="type" label="类型" ><el-radio-group v-model="ResourceInfo.type" ref="type"><el-radio border label="静态"></el-radio><el-radio border label="动态"></el-radio></el-radio-group></el-form-item></el-form><!--进度条:只有上传时才显示--><div v-if="loading" ><el-progress type="line" :percentage="percentage" class="progress" :show-text="true"></el-progress></div><!-- 上传和取消按钮 --><div slot="footer" class="dialog-footer"><el-button @click="quxiao()">取 消</el-button><!-- 调用上传文件方法,将填写的表单数据做为参数 --><el-button type="primary" @click="submitFileInfo(ResourceInfo)">确 定</el-button></div></el-dialog></div></template>

二、JS部分

1、数据和数据校验部分
 <script> 
export default {name:"ResourceAdd",//组件是否显示(父组件传过来的)props: {isShowAdd: {type: Boolean,default: false},},data() {//数据校验var Type = (rule, value, callback) => {if (value === '') {callback(new Error('请选择壁纸类型'));this.islose = true;} else {this.islose = falsecallback();}};//数据校验var Tag = (rule, value, callback) => {if (value === '') {callback(new Error('请添加标签'));this.islose = true;} else if (value.length < 4) {callback(new Error('最少输入4个字'));this.islose = true;} else {this.islose = false;callback();}};return {resouceFileImg:null,loading:false,  //进度条是否隐藏percentage:0,   //进度条数值dialogVisible:false,  //是否上传完备//要上传文件的信息ResourceInfo: {"file":"","tag":"","type":""},//要校验的表单信息rules: { type: [{ validator: Type, trigger: 'blur'}],tag: [{ validator: Tag, trigger: 'blur' }],},};},</script>
2、方法部分
<script>export default {methods: {submitFileInfo(resourceInfo){//调用文件类型判断方法,检查上传文件类型是否合法(返回Boolean类型)let fileTypeCheck=this.fileTypeCheck(resourceInfo.file)//  判断文件是否合法if(fileTypeCheck){//文件通过校验,校验其它要上传里其它参数是否合法this.$refs.ResourceInfo.validate((valid) => {if(valid){//如果都合法// 直接通过new来创建FormData对象,用来装文件对象和其它参数()let UpResourceInfo = new FormData();//通过append将数据添加到FormData中(数据是键值对类型)//注意:键要和后端接收的参数列表一一对应。UpResourceInfo.append('file', resourceInfo.file);UpResourceInfo.append("email",window.sessionStorage.getItem("Account"));UpResourceInfo.append("tag",resourceInfo.tag);UpResourceInfo.append("type",resourceInfo.type);//计算过上传进度// 进度条的实现主要依靠axios中提供的onUploadProgress函数//该函数提供了文件已上传部分的大小progressEvent.loaded和文件总大小progressEvent.total,利用这两个数据我们就可以计算出已经上传文件的进度。let config = {onUploadProgress: progressEvent => {//progressEvent.loaded:已上传文件大小//progressEvent.total:被上传文件的总大小let complete = (progressEvent.loaded / progressEvent.total ).toFixed(2) * 100 ;this.percentage = complete;   //上传进度if (this.percentage >= 100){this.dialogVisible = true  //上传完毕}} };//显示进度条this.loading = true;//通过axios对后端接口发起请求,并将上面的FormData对象参数发送过去,已经。axios.post("http://localhost:8888/resources/uploadResource",UpResourceInfo,config).then((res)=>{if(res.data.flag==true){ //清空表单信息this.ResourceInfo={"file":"","tag":"","type":""}//清除上传文件列表this.$refs.upload.clearFiles();this.loading=false; //隐藏进度条this.$message.success("添加成功!")//调用父组件的方法隐藏弹窗// this.$parent.AddSuccessColse(); }}).catch((err)=>{this.$message.error(err)//清空表单信息this.ResourceInfo={};//清除上传文件列表this.$refs.upload.clearFiles();//调用父组件的方法隐藏弹窗//this.$parent.AddSuccessColse(); })}});}},// 文件类型、大小数据校验fileTypeCheck(file) {const isJPG = file.type === 'image/jpg';const isJPEG = file.type === 'image/jpeg';const isPNG = file.type === 'image/png';const isMP4 = file.type === 'video/mp4';const isLt30M = file.size / 1024 / 1024 < 30;if (!isJPG && !isJPEG && !isPNG && !isMP4) {this.$message.error('请上传 JPG、PNG、MP4格式文件!');} else if (!isLt30M) {this.$message.error('大小不能超过 30MB!');}return (isJPG || isPNG || isMP4 || isJPEG) && isLt30M;},//将上传的文件对象赋值到要上传的键值对中httprequest(param) {//将通过钩子函数函数,传过来的文件上传信息,中的文件赋值到要上传的键值对中this.ResourceInfo.file = param.file;},//取消时调用的方法quxiao() {this.$message.info("取消添加!");//清空表单信息this.ResourceInfo={"file":"","tag": "","type":""}this.$refs.upload.clearFiles();//通过调用父组件的方法来隐藏子组件(子组件无法修改父组件的值)this.$parent.AddQuXiaoColse();},//文件数量超过1个时自动调用的handleExceed(files, fileList) {this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);},//是否删除文件列表中的文件(删除时自动调用)beforeRemove(file) {let isDel=this.$confirm(`确定移除 ${ file.name }`);console.log(isDel)return isDel;}},}</script>

三、后端代码(Springboot)

1、接口层方法(Controller)
 //资源上传接口@PostMapping("/uploadResource")public Result uploadResource(MultipartFile file,String email,String tag,String type){//生成UUID用来重新命名文件和做ridString uuid= UUID.randomUUID().toString().replaceAll("-","");Resource resource =new Resource();resource.setRid(uuid);resource.setEmail(email);resource.setTag(tag);resource.setType(type);return new Result(iResourceService.uploadResource(file,resource));}
2、服务层方法(Service)
//上传资源方法@Overridepublic Boolean uploadResource(MultipartFile file, Resource resource) {if(!file.isEmpty()){String  fullName = file.getOriginalFilename();  //获取全文件名String type = fullName.substring(file.getOriginalFilename().lastIndexOf(".")); //获取文件后缀String fileName=resource.getRid()+type;  //拼接新文件名//获取上传目录路径ApplicationHome applicationHome=new ApplicationHome(this.getClass());String pre=applicationHome.getDir().getParentFile().getParentFile()+"\\src\\main\\resources\\static\\wallpaper\\";//拼接上传路径String path=pre+fileName;try {//将文件上传到指定目录file.transferTo(new File(path));//将文件拼接成可访问的在线链接,并赋值到对象的setRUrl属性中resource.setRUrl("http://localhost:8888/static/wallpaper/"+fileName);}catch (IOException e){e.printStackTrace();}}//将图像信息插入到数据库中return resourceDao.insert(resource)==1;}
3、数据库数据

在这里插入图片描述

四、前端组件全部代码(ResourceAdd.vue)

效果图如下:

在这里插入图片描述

<template><!-- 控制子组件显示还是隐藏: :visible.sync="isShow"  --><div><!-- 弹窗 --><el-dialog width="30%" :modal="true" title="新增资源" :modal-append-to-body="true" :visible.sync="isShowAdd":close-on-click-modal="false" :close-on-press-escape='false' :show-close="false" center><!-- 需要上传的表单::model 和 ref 的值尽量保持一致,ref在的值在提交数据时进行对提交的数据进行校验 --><el-form :model="ResourceInfo" ref="ResourceInfo" :rules="rules"  size="small" label-width="120px" label-position="right" key="1" :hide-required-asterisk="true"><el-form-item label="资源" ><!-- 文件上传:http-request这里用来获取到要上传的文件。limit限制文件个数。on-exceed:用来校验文件个数 ,before-remove:删除上传列表时提示用户--><el-uploadclass="upload-demo" action="" ref="upload"  :http-request="httprequest" :limit=1 :drag="true" :on-exceed="handleExceed" :before-remove="beforeRemove"><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击选择文件</em></div></el-upload></el-form-item><!-- 文本框用来填写要上传一个参数,这里是为了给文件打标签 --><el-form-item prop="tag"  label="标签"><el-input v-model="ResourceInfo.tag" ref="tag" maxlength="30" autocomplete="off"  placeholder="如:风景/天空"></el-input></el-form-item><!-- 单选框,也是文件的一个参数 --><el-form-item prop="type" label="类型" ><el-radio-group v-model="ResourceInfo.type" ref="type"><el-radio border label="静态"></el-radio><el-radio border label="动态"></el-radio></el-radio-group></el-form-item></el-form><!--进度条:只有上传时才显示--><div v-if="loading" ><el-progress type="line" :percentage="percentage" class="progress" :show-text="true"></el-progress></div><!-- 上传和取消按钮 --><div slot="footer" class="dialog-footer"><el-button @click="quxiao()">取 消</el-button><!-- 调用上传文件方法,将填写的表单数据做为参数 --><el-button type="primary" @click="submitFileInfo(ResourceInfo)">确 定</el-button></div></el-dialog></div></template><script>export default {name:"ResourceAdd",//组件是否显示(父组件传过来的)props: {isShowAdd: {type: Boolean,default: false},},data() {//数据校验var Type = (rule, value, callback) => {if (value === '') {callback(new Error('请选择壁纸类型'));this.islose = true;} else {this.islose = falsecallback();}};//数据校验var Tag = (rule, value, callback) => {if (value === '') {callback(new Error('请添加标签'));this.islose = true;} else if (value.length < 4) {callback(new Error('最少输入4个字'));this.islose = true;} else {this.islose = false;callback();}};return {resouceFileImg:null,loading:false,  //进度条是否隐藏percentage:0,   //进度条数值dialogVisible:false,  //是否上传完备//要上传文件的信息ResourceInfo: {"file":"","tag":"","type":""},//要校验的表单信息rules: { type: [{ validator: Type, trigger: 'blur'}],tag: [{ validator: Tag, trigger: 'blur' }],},};},methods: {submitFileInfo(resourceInfo){//调用文件类型判断方法,检查上传文件类型是否合法(返回Boolean类型)let fileTypeCheck=this.fileTypeCheck(resourceInfo.file)//  判断文件是否合法if(fileTypeCheck){//文件通过校验,校验其它要上传里其它参数是否合法this.$refs.ResourceInfo.validate((valid) => {if(valid){//如果都合法// 直接通过new来创建FormData对象,用来装文件对象和其它参数()let UpResourceInfo = new FormData();//通过append将数据添加到FormData中(数据是键值对类型)//注意:键要和后端接收的参数列表一一对应。UpResourceInfo.append('file', resourceInfo.file);UpResourceInfo.append("email",window.sessionStorage.getItem("Account"));UpResourceInfo.append("tag",resourceInfo.tag);UpResourceInfo.append("type",resourceInfo.type);//计算过上传进度// 进度条的实现主要依靠axios中提供的onUploadProgress函数//该函数提供了文件已上传部分的大小progressEvent.loaded和文件总大小progressEvent.total,利用这两个数据我们就可以计算出已经上传文件的进度。let config = {onUploadProgress: progressEvent => {//progressEvent.loaded:已上传文件大小//progressEvent.total:被上传文件的总大小let complete = (progressEvent.loaded / progressEvent.total ).toFixed(2) * 100 ;this.percentage = complete;   //上传进度if (this.percentage >= 100){this.dialogVisible = true  //上传完毕}} };//显示进度条this.loading = true;//通过axios对后端接口发起请求,并将上面的FormData对象参数发送过去,已经。axios.post("http://localhost:8888/resources/uploadResource",UpResourceInfo,config).then((res)=>{if(res.data.flag==true){ //清空表单信息this.ResourceInfo={"file":"","tag":"","type":""}//清除上传文件列表this.$refs.upload.clearFiles();this.loading=false; //隐藏进度条this.$message.success("添加成功!")//调用父组件的方法隐藏弹窗// this.$parent.AddSuccessColse(); }}).catch((err)=>{this.$message.error(err)//清空表单信息this.ResourceInfo={};//清除上传文件列表this.$refs.upload.clearFiles();//调用父组件的方法隐藏弹窗//this.$parent.AddSuccessColse(); })}});}},// 文件类型、大小数据校验fileTypeCheck(file) {const isJPG = file.type === 'image/jpg';const isJPEG = file.type === 'image/jpeg';const isPNG = file.type === 'image/png';const isMP4 = file.type === 'video/mp4';const isLt30M = file.size / 1024 / 1024 < 30;if (!isJPG && !isJPEG && !isPNG && !isMP4) {this.$message.error('请上传 JPG、PNG、MP4格式文件!');} else if (!isLt30M) {this.$message.error('大小不能超过 30MB!');}return (isJPG || isPNG || isMP4 || isJPEG) && isLt30M;},//将上传的文件对象赋值到要上传的键值对中httprequest(param) {//将通过钩子函数函数,传过来的文件上传信息,中的文件赋值到要上传的键值对中this.ResourceInfo.file = param.file;},//取消时调用的方法quxiao() {this.$message.info("取消添加!");//清空表单信息this.ResourceInfo={"file":"","tag": "","type":""}this.$refs.upload.clearFiles();//通过调用父组件的方法来隐藏子组件(子组件无法修改父组件的值)this.$parent.AddQuXiaoColse();},//文件数量超过1个时自动调用的handleExceed(files, fileList) {this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);},//是否删除文件列表中的文件(删除时自动调用)beforeRemove(file) {let isDel=this.$confirm(`确定移除 ${ file.name }`);console.log(isDel)return isDel;}},}</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/236727.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 面试题 - 多线程并发篇

线程基础 创建线程有几种方式 继承Thread类 可以创建一个继承自Thread类的子类&#xff0c;并重写其run()方法来定义线程的行为。然后可以通过创建该子类的实例来启动线程。 示例代码&#xff1a; class MyThread extends Thread {public void run() {// 定义线程的行为} …

ubuntu20.04网络问题以及解决方案

1.网络图标消失&#xff0c;wired消失&#xff0c;ens33消失 参考&#xff1a;https://blog.51cto.com/u_204222/2465609 https://blog.csdn.net/qq_42265170/article/details/123640669 原始是在虚拟机中切换网络连接方式&#xff08;桥接和NAT&#xff09;&#xff0c; 解决…

K8S--安装MySQL8(单机)

原文网址&#xff1a;K8S--安装MySQL8&#xff08;单机&#xff09;-CSDN博客 简介 本文介绍K8S部署MySQL8&#xff08;单机&#xff09;的方法。 ----------------------------------------------------------------------------------------------- 分享Java真实高频面试题…

解决虚拟机的网络图标不见之问题

在WIN11中&#xff0c;启动虚拟机后&#xff0c;发现网络图标不见了&#xff0c;见下图&#xff1a; 1、打开虚拟机终端 输入“sudo server network-manager stop”&#xff0c;停止网络管理器 输入“cd /回车” &#xff0c; 切换到根目录 输入“cd var回车” &#xff0c;…

探索Shadowsocks-Android:保护你的网络隐私

探索Shadowsocks-Android&#xff1a;保护你的网络隐私 I. 引言 在数字时代&#xff0c;网络隐私和安全变得愈发重要。我们越来越依赖互联网&#xff0c;但同时也面临着各种网络限制和监控。在这个背景下&#xff0c;Shadowsocks-Android应用程序应运而生&#xff0c;为用户提…

java Servlet体育馆运营管理系统myeclipse开发mysql数据库网页mvc模式java编程计算机网页设计

一、源码特点 JSP 体育馆运营管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统采用serlvetdaobean&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。 java Servlet体育馆运营管理系…

自定义数据实现SA3D

SA3D&#xff1a;Segment Anything in 3D with NeRFs 实现了3D目标分割 原理是利用SAM(segment anything) 模型和Nerf分割渲染3D目标&#xff0c; SAM只能分块&#xff0c;是没有语义标签的&#xff0c;如何做到语义连续&#xff1f; SA3D中用了self-prompt, 根据前一帧的mask…

【Java】正则表达式( Pattern 和 Matcher 类)

快速入门 Java 提供了 java.util.regex 包&#xff0c;它包含了 Pattern 和 Matcher 类&#xff0c;用于处理正则表达式的匹配操作。 java.util.regex 包主要包括以下三个类&#xff1a; Pattern 类&#xff1a; pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共…

书生·浦语大模型--第二节课笔记

书生浦语大模型--第二节课 大模型及InternLM基本介绍实战部分demo部署准备工作模型下载代码准备终端运行web demo 运行 Lagent 智能体工具调用 Demo准备工作Demo 运行 浦语灵笔图文理解创作 Demo环境准备下载模型下载代码运行 大模型及InternLM基本介绍 大模型 定义&#xff…

C语言快速排序——qsort函数

上面的是我们标准C语言库里面对qsort函数的介绍&#xff0c;我们先来从排序说起&#xff1a; 这就不得不提出编程中最最基础的排序算法---冒泡排序 对于一个任意的无序数列&#xff0c;我们如果想要把他排成顺序数列的话&#xff0c;我们就可以让每一项跟后面的一项去比较&…

Windows11 安装MySQL8.0操作

一、从MySQL官网下载MySQL安装包 官网地址&#xff1a; www.mysql.com &#xff08;1&#xff09;首先 选择 DOWNLOADS 下载界面 &#xff08;2&#xff09;其次选择 MySQL 客户端 下载 &#xff08;3&#xff09;选择windows安装MySQL &#xff08;4&#xff09;选择MySQL类型…

Ubuntu开机自动挂载硬盘

前言&#xff1a; 因为我的电脑是WIN10 Ubuntu18.04双系统&#xff0c;且两个系统都装在C盘上&#xff0c;而D盘作为数据和代码存储盘&#xff0c;经常会开机就被访问&#xff0c;例如上一次关机前用VS Code访问D盘代码&#xff0c;然后下一次开机的时候打开VSCode发现打不开…

锁定查询功能,完成查询后防止他人查询

查询者想要实现自己查询完成后&#xff0c;任何人都无法再次查询&#xff0c;发布者应该如何设置&#xff1f;易查分的【锁定查询功能】就可实现&#xff0c;本次就来介绍如何使用此功能。 &#x1f4cc;使用教程 &#x1f512;锁定查询功能介绍 ✅用户自主锁定&#xff1a;开启…

使用Scrapy框架和代理IP进行大规模数据爬取

目录 一、前言 二、Scrapy框架简介 三、代理IP介绍 四、使用Scrapy框架进行数据爬取 1. 创建Scrapy项目 2. 创建爬虫 3. 编写爬虫代码 4. 运行爬虫 五、使用代理IP进行数据爬取 1. 安装依赖库 2. 配置代理IP和User-Agent 3. 修改爬虫代码 4. 运行爬虫 六、总结 一…

数据结构 模拟实现二叉树(孩子表示法)

目录 一、二叉树的简单概念 &#xff08;1&#xff09;关于树的一些概念 &#xff08;2&#xff09;二叉树的一些概念及性质 定义二叉树的代码&#xff1a; 二、二叉树的方法实现 &#xff08;1&#xff09;createTree &#xff08;2&#xff09;preOrder &#xff08;…

关键信息基础设施安全相关材料汇总

文章目录 前言一、法律(1)《中华人民共和国国家安全法》(2)《中华人民共和国网络安全法》(3) 《中华人民共和国密码法》(4)《中华人民共和国数据安全法》(5) 《中华人民共和国个人信息保护法》二、行政法规(6)《中华人民共和国保守国家秘密法实施条例》(7) 《关键信息基础设施安…

Python学习从0到1 day3 python变量和debug

没关系&#xff0c;这破败的生活压不住我 ——24.1.13 一、变量的定义 1.什么是量&#xff1f; 量是程序运行中的最小单元 2.什么是变量呢&#xff1f; ①变量是存储数据的容器 ②变量存储的数据时临时的&#xff0c;变量只有在程序运行过程中是有效的&#xff0c;当程序执行结…

【教学类-43-18】A4最终版 20240111 数独11.0 十宫格X*Y=Z套(n=10),套用没有分割行列的A4横版模板

作品展示&#xff1a; 撑满格子的10宫格数独50%难度 50空 背景需求&#xff1a; 大4班有3位男孩做9宫格数独&#xff08;81格子&#xff0c;30%难度 24空&#xff09;非常娴熟&#xff0c;我观察他们基本都在10分钟内完成&#xff0c;其中一位男孩把九宫格题目给我看时表达自…

java进阶||jdk进阶之循环

从18年学java到现在除了各种各样的数据类型和集合烧不了要遍历这些变量, for循环这时就少不了啦(当然还有8后引入的神器泛型) 先来看一段精髓业务代码, 使用了多个新特性当然也少不了循环和分支判断 代码较长解析在后面 private CommonPage<List<Object>> handle…

SqlAlchemy使用教程(一) 原理与环境搭建

一、SqlAlchemy 原理及环境搭建 SqlAlchemy是1个支持连接各种不同数据库的Python库&#xff0c;提供DBAPI与ORM&#xff08;object relation mapper&#xff09;两种方式使用数据库。 DBAPI方式&#xff0c;即使用SQL方式访问数据库 ORM, 对象关系模型&#xff0c;是用 Python…