结合el-upload上传组件,验证文件格式及大小
结合el-upload上传组件,验证文件格式及大小
效果如下:

代码如下:
upgradeFirmwareInfo.vue页面
<template><div><el-dialog title="新增固件升级包" :visible.sync="dialogFormVisible"top="7vh" width="760px"class="commonDialog" :close-on-click-modal="false"><el-form :model="firmwareUpgradePackForm" :rules="rules" ref="firmwareUpgradePackForm"><el-form-item prop="fileUrl" class="m-l15"><el-upload:limit="1"ref="upload"action:on-preview="handlePreview":on-remove="handleRemove":on-change="handleChange":file-list="selectedFileList":on-exceed="handleExceed":auto-upload="false"> <el-button slot="trigger" class="btn-rectangle btn-darkGreen">上传文件</el-button><el-tooltip class="item m-r10" effect="dark" placement="right"><div slot="content">注意:只能上传一个文件,文件大小不能超过2G,且文件格式必须为zip或bin</div><i class="el-icon-question el-icon--right stateDesRed font-16"></i></el-tooltip></el-upload></el-form-item><el-form-item prop="fileSize" label="固件大小" :label-width="formLabelWidth"><div class="f-r"><el-input v-model="firmwareUpgradePackForm.fileSize" autocomplete="off" :disabled="true"></el-input><span class="m-l2">{{firmwareUpgradePackForm.fileSizeUnit}}</span></div></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button class="btn-rectangle btn-darkGreen" @click="submitAddForm('firmwareUpgradePackForm')">确定</el-button><el-button class="btn-rectangle btn-grey" @click="cancelForm()">取消</el-button></div></el-dialog></div>
</template><script>
import Consts from "../../../../../public/constants/commonConsts";
export default {components: {},data() {let validateFileUrl = (rule, value, callback) => {if (this.selectedFileList.length<=0) {callback(new Error("请上传文件"));}else {callback();}};return {dialogFormVisible: true,firmwareUpgradePackForm: {fileSize:null,fileSizeUnit:"B",fileUrl:""},rules: {fileSize:[{ required: true, message:"请输入固件大小", trigger: "blur"}],fileUrl: [{ min: 1, max: 1000, message: "最多只能输入1000个字符", trigger: "blur" },{ required: true, validator: validateFileUrl, trigger: "blur" }]},formLabelWidth:"90px",selectedFileList: [],fileContent:'',}},mounted() {},methods: {//选取文件handleChange(file, fileList) {console.log(file);console.log(fileList);//验证文件类型let fileTypeLimitList = ["zip","bin"];let verifyFormatValue = Consts.verifyFileFormat(file.raw, fileTypeLimitList);if(!verifyFormatValue){this.selectedFileList = [];this.fileContent = "";return false;}//验证文件大小let verifySizeValue_zero = Consts.verifyFileSize_zero(file.raw);if(!verifySizeValue_zero){this.selectedFileList = [];this.fileContent = "";return false;}let verifySizeValue = Consts.verifyFileSize(file.raw, 2,"G");if(!verifySizeValue){this.selectedFileList = [];this.fileContent = "";return false;}this.fileContent = "";this.selectedFileList = [];this.fileContent = file.raw;},//当上传的升级包超出个数限制时钩子函数handleExceed(files, fileList) {console.log(files);console.log(fileList);console.log(this.selectedFileList);let newFile = files[0];//验证文件类型let fileTypeLimitList = ["zip","bin"];let verifyFormatValue = Consts.verifyFileFormat(newFile, fileTypeLimitList);if(!verifyFormatValue){this.selectedFileList = [];this.fileContent = "";return false;}//验证文件大小let verifySizeValue_zero = Consts.verifyFileSize_zero(newFile);if(!verifySizeValue_zero){this.selectedFileList = [];this.fileContent = "";return false;}let verifySizeValue = Consts.verifyFileSize(newFile, 2,"G");if(!verifySizeValue){this.selectedFileList = [];this.fileContent = "";return false;}this.fileContent = "";this.selectedFileList = [];this.fileContent = newFile;},//移除上传文件包handleRemove(file, fileList) {this.fileContent = "";this.selectedFileList = [];this.firmwareUpgradePackForm.fileSize = null;this.firmwareUpgradePackForm.fileSizeUnit = "B";this.firmwareUpgradePackForm.fileUrl = "";},//点击已上传的文件链接时的钩子, 可以通过 file.response 拿到服务端返回数据,类似查看文件具体内容(暂时未使用)handlePreview(file) {console.log(file);},//保存新增固件升级包submitAddForm(formName) {this.$refs[formName].validate(async valid => {if (valid) {//可根据自己的需求继续往下...} else {console.log("error submit!!");return false;}});},cancelForm(){this.dialogFormVisible = false;}}
}
</script><style lang='less' scoped></style>
引入的commonConsts.js
export default class Consts {/*** 验证上传附件大小(支持G、M、K、B)* @param file* @param maxSize* @param unit* @return*/static verifyFileSize(file, maxSize, unit) {let limitResult = false;if(unit=="G"){limitResult = file.size / 1024 / 1024/ 1024 < maxSize;}if(unit=="M"){limitResult = file.size / 1024 / 1024 < maxSize;}if(unit=="K"){limitResult = file.size / 1024 < maxSize;}if(unit=="B"){limitResult = file.size < maxSize;}if (!limitResult) {Message({message: '上传文件大小不能超过'+maxSize+unit,type: 'error'})return false;}else{return true;}};/*** 验证上传附件大小为0* @param file* @return*/static verifyFileSize_zero(file) {if (file.size == 0) {Message({message: "上传文件大小为0",type: 'error'})return false;}else{return true;}};/*** 验证上传附件格式* @param file* @param fileTypeLimitList* @return*/static verifyFileFormat(file, fileTypeLimitList) {let fileNameList = file.name.split('.'); let lastIndex = fileNameList.length - 1;let currentFilType = fileNameList[lastIndex].toLowerCase();let findResult = fileTypeLimitList.find(item => item === currentFilType);if(findResult == undefined){let tip = "";fileTypeLimitList.forEach((item,index) => {if(index == 0){tip = item;}else{tip = tip + "、" +item;}});Message({message: '上传文件只能是'+tip+'格式',type: 'error'})return false;}else{return true;}};
}
如有漏洞,欢迎宝子互动指教!!!!!!!!!!!!!
相关文章:
结合el-upload上传组件,验证文件格式及大小
结合el-upload上传组件,验证文件格式及大小 效果如下: 代码如下: upgradeFirmwareInfo.vue页面 <template><div><el-dialog title"新增固件升级包" :visible.sync"dialogFormVisible"top"7vh&qu…...
配置php-fpm服务
nginx(unix domain socket方式) server {listen 80;#root /test/php/publiclocation / {#URL重写 例如隐藏index.phpif (!-f $request_filename) {rewrite ^(.*)$ /index.php?s/$1 last;break;}}location ~ [^/]\.php(/|$) {#try_files $uri 404;fastcgi_index index.php;…...
科普文:Linux系统安全加固指南
本指南仅关注安全性和隐私性,而不关注性能,可用性或其他内容。 列出的所有命令都将需要root特权。以“$”符号开头的单词表示一个变量,不同终端之间可能会有所不同。 选择正确的Linux发行版 选择一个好的Linux发行版有很多因素。 避免分发…...
MFC开发,自定义消息
在MFC开发中,主要核心机制就是消息机制。QT与之类似的机制就是信号与槽。QT中的信号与槽是非常容易自定义的,MFC也是如此,自定义也是比较方便,况且自定义消息或者控件在整个GUI图形化界面开发中也是非常重要的部分,上篇…...
如何在 SpringBoot 中优雅的做参数校验?
一、故事背景 关于参数合法性验证的重要性就不多说了,即使前端对参数做了基本验证,后端依然也需要进行验证,以防不合规的数据直接进入服务器,如果不对其进行拦截,严重的甚至会造成系统直接崩溃! 本文结合…...
Godot入门 03世界构建1.0版
在game场景,删除StaticBody2D节点,添加TileMap节点 添加TileSet图块集 添加TileSet源 拖动图片到图块,自动创建图块 使用橡皮擦擦除。取消橡皮擦后按住Shift创建大型图块。 进入选择模式,TileMap选择绘制,选中图块后在…...
GitHub每日最火火火项目(7.26)
1. 项目名称:meta - llama / llama3 项目介绍:这是 Meta Llama 3 的官方 GitHub 站点。目前尚不清楚该项目的具体功能和特点,但从名称推测,它可能与 Llama 3 模型相关,或许涉及到该模型的开发、训练或应用等方面。 项…...
微服务实践和总结
H5原生组件web Component Web Component 是一种用于构建可复用用户界面组件的技术,开发者可以创建自定义的 HTML 标签,并将其封装为包含逻辑和样式的独立组件,从而在任何 Web 应用中重复使用。 <!DOCTYPE html> <html><head…...
Spring Boot中的策略模式:优雅地处理不同商品类型的订单
引言 在开发复杂的业务系统时,我们经常会遇到需要根据不同条件执行不同逻辑的情况。例如,在电商平台中,可能需要根据商品的不同类型(如电子产品、服装、食品等)来执行不同的业务逻辑,比如不同的库存管理、…...
django_创建菜单(实现整个项目的框架,调包)
文章目录 前言代码仓库地址在线演示网址启动网站的时候出现错误渲染路径的一些说明文件结构网页显示一条错误路由顺序js打包出现问题的代码函数没有起作用关于进度开发细节显示不了图片梳理一下函数调用的流程修改一些宽度参数classjs 里面的一些细节让三个按钮可以点击设置按钮…...
最新全新UI异次元荔枝V4.4自动发卡系统源码
简介: 最新全新UI异次元荔枝V4.4自动发卡系统源码 更新日志: 1增加主站货源系统 2支持分站自定义支付接口 3目前插件大部分免费 4UI页面全面更新 5分站可支持对接其他分站产品 6分站客服可自定义 7支持限定优惠 图片: 会员中心截图&…...
PyTorch安装CUDA标准流程(可解决大部分GPU无法使用问题)
最近一段时间在研究PyTorch中的GPU的使用方法,之前曾经安装过CUDA,不过在PyTorch中调用CUDA时无法使用。考虑到是版本不兼容问题,卸载后尝试了其他的版本,依旧没有能解决问题,指导查阅了很多资料后才找到了解决方案。 …...
C++从入门到起飞之——初始化列表类型转换static成员 全方位剖析!
🌈个人主页:秋风起,再归来~🔥系列专栏:C从入门到起飞 🔖克心守己,律己则安 目录 1、初始化列表 2、 类型转换 3. static成员 4、完结散花 1、初始化列表 • 之前我们实现构造函数…...
PHP框架简介
PHP是一种广泛使用的开源脚本语言,主要用于Web开发,它可以创建动态交互式Web页面。而PHP框架则是一套用于开发Web应用程序的工具和库的集合,它可以帮助开发者更高效地编写PHP代码,提高开发速度和代码的可维护性。 理解PHP框架&am…...
微信小程序-粘性组件
再次完善:将区域设置为粘性时,会脱离原有文档,使得出现下方页面突然遮盖一部分,不平滑 解决:给出一个新的空白区域,宽高与粘性区域一致,wx:if 控制其显示 /****************/ 后续补充&#…...
微服务注册中心
目录 1.微服务的注册中心 1.1 注册中⼼的主要作⽤ 1.2 常⻅的注册中⼼ 2.nacos简介 2.1 nacos实战⼊⻔ 2.2.1 搭建nacos环境 2.2.2 将商品微服务注册到nacos 3.服务调⽤Ribbon⼊⻔ 3.1 Ribbon概述 3.1.1 什么是Ribbon 3.1.2 Ribbon的主要作⽤ 3.2.2 ⼯程改造 4.服务…...
HDU1032——The 3n + 1 problem,HDU1033——Edge,HDU1034——Candy Sharing Game
目录 HDU1032——The 3n 1 problem 题目描述 运行代码 代码思路 HDU1033——Edge 题目描述 运行代码 代码思路 HDU1034——Candy Sharing Game 题目描述 运行代码 代码思路 HDU1032——The 3n 1 problem 题目描述 Problem - 1032 运行代码 #include <iostr…...
内网对抗-隧道技术篇防火墙组策略HTTP反向SSH转发出网穿透CrossC2解决方案
知识点: 1、C2/C2上线-CrossC2插件-多系统平台支持 2、隧道技术篇-应用层-SSH协议-判断&封装&建立&穿透 3、隧道技术篇-应用层-HTTP协议-判断&封装&建立&穿透隧道技术主要解决网络通讯问题:遇到防火墙就用隧道技术,…...
实战案例:如何用ChatGPT生成适合不同领域的高质量文章
随着人工智能技术的快速进展,制作高质量文章已变得轻而易举。尤其是OpenAI推出的ChatGPT,极大地简化了写作任务。接下来,本文将通过具体案例,详解如何利用ChatGPT撰写不同领域的高品质文章。 背景:光辉AI交流-免费问答…...
多线程案例-单例模式
单例模式是设计模式之一,能保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例 单例模式的具体实现方法有很多,最常见的是 “饿汉” 和 “懒汉” 两种。 饿汉模式 class Singlenton{private static Singlenton instance new Sin…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
