在这里插入图片描述

<el-uploadclass="uploadDemo":limit="1"dragaccept=".xls,.xlsx"  <!-- 只保留Excel格式 -->:on-exceed="handleExceedFileLimit":on-change="handleChangeExcelFile":on-remove="handleRemoveExcelFile":before-remove="beforeRemoveFile":file-list="uploadExcelFileList":auto-upload="false"action=""
><i class="el-icon-upload"></i><center><div class="el-upload__text">将文件拖到此处,或<em>点击上传文件</em></div><div slot="tip" class="el-upload__tip">支持上传EXCEL文件(.xls,.xlsx)<br />一次只允许上传一个文件且文件大小不超过{{ maxFileSize }}MB)</div></center>
</el-upload>
<div><el-buttontype="primary"v-show="uploadExcelFileList.length > 0"@click="confirmExcelUpload">上传</el-button>
</div>

(1)限制只能上传 Excel 类型文件

修改accept属性的值(accept=".pdf,.doc,.docx,.ppt,.pptx,.xls,.xlsx"),只保留 Excel 相关的文件格式。

同时,在handleChangeExcelFile方法中添加类型验证(以 Vue 为例):

methods: {handleChangeExcelFile(file, fileList) {// 获取文件后缀名const fileName = file.name;const suffix = fileName.substring(fileName.lastIndexOf('.')).toLowerCase();// 验证文件类型if (suffix !== '.xls' && suffix !== '.xlsx') {this.$message.error('请上传Excel格式的文件(.xls或.xlsx)');// 从文件列表中移除不符合要求的文件this.uploadExcelFileList = fileList.filter(item => item.uid !== file.uid);return false;}// 后续的处理逻辑...}
}

①accept属性在文件选择对话框层面就过滤掉非 Excel 文件;
②代码中的二次验证可以防止用户通过修改文件后缀名绕过限制;

(2)el-upload组件属性

  1. :on-exceed="handleExceedFileLimit"
    作用:当上传的文件数量超过 limit 限制时触发的回调函数。
    场景:例如设置了 :limit=“1”(最多传 1 个文件),当用户尝试上传第 2 个文件时触发。
    参数:接收两个参数 files(超出的文件列表)和 fileList(当前所有文件列表)。
/*** 图片超出个数限制*/
handleExceedFileLimit() {this.$message.error('已超出最大文件个数');
},
  1. :on-change="handleChangeExcelFile"
    作用:文件状态发生变化时触发(包括文件选择、上传成功 / 失败、进度更新等)。
    场景:选择文件后、文件上传中、上传完成(成功 / 失败)等时机都会触发。
    参数:接收三个参数 file(当前操作的文件对象)、fileList(当前所有文件列表)、event(原生事件)。
    典型用途:
    ①验证文件类型 / 大小
    ②更新上传进度显示
    ③处理上传成功 / 失败的逻辑
/*** 文件状态发生改变时触发*/
handleChangeExcelFile(file, fileList) {// 获取文件后缀名const fileName = file.name;const suffix = fileName.substring(fileName.lastIndexOf('.')).toLowerCase();// 验证文件类型if (suffix !== '.xls' && suffix !== '.xlsx') {this.$message.error('请上传Excel格式的文件(.xls或.xlsx)');// 从文件列表中移除不符合要求的文件this.uploadExcelFileList = fileList.filter(item => item.uid !== file.uid);return false;}// 添加文件this.uploadExcelFileList.push(file);
},
  1. :on-remove="handleRemoveExcelFile"
    作用:文件被成功删除后触发的回调函数。
    场景:用户删除已选中 / 上传的文件,且通过了 before-remove 验证后触发。
    参数:接收两个参数 file(被删除的文件对象)和 fileList(删除后的文件列表)。
    典型用途:
    ①同步更新本地文件列表数据
    ②向后端发送删除文件的请求(如果文件已上传)
/*** 删除文件*/
handleRemoveExcelFile(file, fileList) {this.uploadExcelFileList = [];
},
  1. :before-remove="beforeRemoveFile"
    作用:删除文件前触发的回调函数,用于确认是否允许删除。
    场景:用户点击删除按钮时,先执行此方法,再决定是否执行删除操作。
    参数:接收两个参数 file(要删除的文件对象)和 fileList(当前所有文件列表)。
    特殊说明:
    ①返回 true 或 Promise resolve 时,允许删除
    ②返回 false 或 Promise reject 时,阻止删除
/*** 删除文件之前的钩子,参数为上传的文件和文件列表,* 若返回 false 或者返回 Promise 且被 reject,则停止删除。* @param file 移除的图片* @param fileList 图片列表*/
beforeRemoveFile(file, fileList) {return this.$confirm(`确定移除 ${file.name}`);
},

(3)FormData 对象构建表单数据

FormData 对象,用于构建表单数据,专门用于在客户端(浏览器)向服务器发送文件、键值对等数据,尤其适合文件上传场景。

①数据容器:FormData 就像一个 “虚拟表单”,可以通过 append() 方法添加各种数据(字符串、数字、文件等)。

②适配文件上传:由于要上传 Excel 文件(二进制数据),普通的 JSON 格式无法处理二进制数据,而 FormData 是浏览器原生支持的、专门用于传输二进制数据(如文件)键值对的格式,能完美适配文件上传场景。

③与请求配合:通过 this.$request.post(url, formData) 发送请求时,浏览器会自动设置正确的请求头(Content-Type: multipart/form-data),确保服务器能正确解析表单数据(包括文件)。

/*** 文件上传*/
confirmExcelUpload(){this.$confirm('确认上传', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'info'}).then(() => {const loading = this.$loading({lock: true,text: 'Loading',spinner: 'el-icon-loading',background: 'rgba(0, 0, 0, 0.7)'})if(this.yourId!='' && this.myId!=''){if(this.excelTemplateFileData.length > 0){this.$jitsoseVue.MessageWarning('只能上传一个文件')loading.close()}else{let formData = new FormData() //文件表单对象// 检查上传的文件大小是否超过限制if (this.uploadExcelFileList[0].size > this.maxFileSize * 1024 * 1024) {this.uploadExcelFileList = []this.$jitsoseVue.MessageWarning('文件过大,请重新上传')return}formData.append('yourId', this.yourId)formData.append('myId', this.myId)formData.append('file', this.uploadExcelFileList[0].raw)this.loading = true;let url = 'file/insertExcelFile'this.$request.post(url, formData).then(res => {this.$message({type: 'info',message: res.data.obj})this.uploadExcelFileList = []this.getExcelTemplateFile()loading.close()this.loading = false;})}}else{this.$jitsoseVue.MessageWarning('请选择yourId与myId')loading.close()}}).catch(error => {this.$message({type: 'info',message: '已取消上传'})})
},

服务器端接收后,可以通过这些键(yourId、myId、file)获取对应的数据,从而完成文件上传和业务处理。

简单说,formData 在这里就是一个 “数据包”,打包了上传文件和相关业务参数,方便通过 HTTP 请求发送给服务器。

(4)el-upload 组件的文件对象结构

在 Element UI 的 el-upload 组件中,this.uploadExcelFileList[0].raw 中的 .raw 是获取原始文件对象的关键属性,这与组件对文件的处理机制有关:

  1. el-upload 组件的文件对象结构

当用户选择文件后,el-upload会将文件信息封装成一个组件自定义的文件对象,存入 file-list 绑定的数组(即 uploadExcelFileList)中。这个对象包含两类信息:

组件自定义的元数据:如 name(文件名)、size(文件大小)、uid(唯一标识)、status(上传状态)等。

浏览器原生的文件对象:通过 raw 属性暴露,对应 HTML5 中的 File`对象(继承自 Blob)。

  1. raw原因

原生 File 对象的必要性:
当需要通过 FormData 上传文件、或在前端处理文件内容(如读取 Excel 数据)时,必须使用浏览器原生的 File 对象。因为组件自定义的文件对象只是对文件信息的描述,而非实际可传输 / 可处理的文件数据

FormData上传的要求:
formData.append('file', 文件对象) 方法要求传入的必须是原生 FileBlob 对象,才能正确构建包含文件二进制数据的表单数据。如果直接传入组件的自定义文件对象(而非 .raw),会导致文件数据无法被正确识别和上传。

  1. 举例说明
    如果打印 this.uploadExcelFileList[0],会看到类似结构:
{name: "数据表格.xlsx",    // 组件提取的文件名size: 20480,             // 组件计算的文件大小(字节)uid: "1629234567890",    // 组件生成的唯一标识status: "ready",         // 组件标记的状态raw: File {              // 原生File对象(关键!)name: "数据表格.xlsx",lastModified: 1629234567890,size: 20480,type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}
}

这里的 raw 才是实际可用于上传的文件数据载体。

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

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

相关文章

自然处理语言NLP:One-Hot编码、TF-IDF、词向量、NLP特征输入、EmbeddingLayer实现、word2vec

文章目录自然语言处理&#xff08;NLP&#xff09;一、什么是自然语言处理&#xff08;NLP&#xff09;&#xff1f;二、NLP 的核心目标三、NLP 的主要应用方向&#xff08;应用场景&#xff09;四、NLP 的基本概念五、NLP 的基本处理流程1. 文本预处理2. 特征表示3. 模型选择与…

单词记忆-轻松记忆10个实用英语单词(13)

1. board含义&#xff1a;板子&#xff1b;董事会&#xff1b;登机 读音标注&#xff1a;/bɔːrd/ 例句&#xff1a;Write your name on the board. 译文&#xff1a;把你的名字写在板上。 衍生含义&#xff1a;董事会&#xff08;如“board of directors”&#xff09;&#…

Spring循环依赖源码调试详解,用两级缓存代替三级缓存

Spring循环依赖源码详解&#xff0c;改用两级缓存并实验 背景 最近一直在研究Spring的循环依赖&#xff0c;发现好像两级缓存也能解决循环依赖。 关于为何使用三级缓存&#xff0c;大致有两个原因 对于AOP的类型&#xff0c;保证Bean生命周期的顺序 对于有AOP代理增强的类型&am…

亚马逊BALL PIT球池外观专利侵权指控?不侵权意见书助力4条链接申诉成功!

儿童球池作为玩具品类中常见的一款产品&#xff0c;能够给儿童提供游乐的安全空间&#xff0c;深受亚马逊平台用户的喜爱。然而在近期&#xff0c;赛贝收到了部分亚马逊卖家的咨询&#xff0c;原因是他们在售的儿童球池产品链接被美国外观专利USD1009203S&#xff08;下称203专…

开源,LangExtract-Python库用LLM从非结构化文本提取结构化信息

摘要&#xff1a; LangExtract是一个Python库&#xff0c;利用大语言模型&#xff08;LLM&#xff09;根据用户定义指令从非结构化文本文档中提取结构化信息。它具备精确源定位、可靠结构化输出、长文档优化、交互式可视化、灵活LLM支持、适应任意领域等特点。可通过几行代码快…

如何根据团队技术能力选择最适合的PHP框架?

作为一名PHP开发者&#xff0c;面对众多的PHP框架&#xff0c;你是否曾感到选择困难&#xff1f;Laravel、Symfony、CodeIgniter、ThinkPHP…每个框架都有其特色和优势&#xff0c;但没有最好的框架&#xff0c;只有最适合的框架。而选择合适框架的关键因素之一&#xff0c;就是…

多人同时导出 Excel 导致内存溢出

1、问题根因分析多人同时导出Excel导致内存溢出&#xff08;OOM&#xff09;的核心原因是&#xff1a;在短时间内&#xff0c;大量数据被加载到JVM堆内存中&#xff0c;且创建了大量大对象&#xff08;如Apache POI的Cell、Row、Sheet对象&#xff09;&#xff0c;超过了堆内存…

深入 RAG(检索增强生成)系统架构:如何构建一个能查资料的大语言模型系统

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、LLM 的局限&#xff1a;模型知识“封闭” vs 现实知识…

linux tftpboot烧写地址分析

1&#xff0c;loadaddr 是一个环境变量&#xff0c;用于指定文件&#xff08;如内核镜像、设备树等&#xff09;加载到内存的起始地址。setenv loadaddr 0x82000000setenv loadaddr 0x80008000saveenv //.保存配置将 loadaddr 设置为 0x82000000&#xff0c;表示后续文件将加载…

硬件工程师9月实战项目分享

目录 简介 人员情况 实战项目简介 功能需求 需求分析 方案设计 电源树设计 时钟树设计 主芯片外围设计 接口设计 模拟链路设计 PCB设计检查要点 测试方案设计 硬件测试培训 测试代码学习 培训目标 掌握基本的硬件设计流程 掌握以FPGA为核心的硬件设计业务知识 …

力扣刷题——59.螺旋矩阵II

力扣刷题——59.螺旋矩阵II 题目 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。示例 1&#xff1a;输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输…

win11系统还原点恢复系统

背景 系统换位bug11后&#xff0c;真的是各种以前的操作和设置找不到&#xff0c;太烦了&#xff0c;我是没想到&#xff0c;连系统恢复还原点都这么难找。然后搜了一圈都是恢复系统之类的&#xff0c;真的崩溃。只好自己记录了。 ✍内容找到设置—>系统–>系统信息系统信…

DHCP 原理与配置(一)

应用场景随着网络规模的不断扩大&#xff0c;网络复杂度不断提升&#xff0c;网络中的终端设备例如主机、手机、 平板等&#xff0c;位置经常变化。终端设备访问网络时需要配置IP地址、网关地址、DNS服务器 地址等。采用手工方式为终端配置这些参数非常低效且不够灵活。 IETF于…

SARibbon的编译构建及详细用法

目录 1.1 源码构建 1.2 搭建项目 1.3 详细用法 1.4 不同风格 1.5 完整代码 引言:SARibbon是一个专门为Qt框架设计的开源Ribbon风格界面控件库,它模仿了微软Office和WPS的Ribbon UI风格,适用于需要复杂菜单和工具栏的大型桌面程序。本文从源码编译构建到详细使用,做了一…

CSS【详解】性能优化

精简 CSS移除未使用的 CSS&#xff08;“死代码”&#xff09;&#xff0c;可借助工具如 PurgeCSS、UnCSS 自动检测并删除未被页面使用的样式。避免重复样式&#xff0c;通过提取公共样式&#xff08;如 mixin 或公共类&#xff09;减少代码冗余。利用预处理器&#xff08;Sass…

Flutter 线程模型详解:主线程、异步与 Isolate

一、主线程&#xff1a;默认的执行环境 所有代码默认运行在主线程。下面的例子展示了一个会阻塞主线程的错误示范&#xff1a; import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({super.key});ov…

ChartDB:可视化数据库设计工具私有化部署

ChartDB:可视化数据库设计工具私有化部署一、什么是ChartDB ChartDB 是一款基于 Web 的开源数据库可视化工具&#xff0c;专为简化数据库设计与管理流程而开发。以下是其核心特性与功能概述: 1、核心功能 智能查询可视化‌&#xff1a;通过单条 SQL 查询即可生成数据库架构图&a…

单片机-FreeRTOS(ing)

目录 一、基础介绍 1.1 调度策略 1.1.1 调度方式 1.1.2 调度器 1.2 任务以及优先级 1.2.1 任务与协程 1.2.2 任务状态 1.2.3 任务优先级 1.2.4 任务优先级分配方案 1.3 任务间通信 - 信号量 1.3.1 信号量 1.3.2 任务间计数信号量的实现 1.3.3 中断方式计数信号量的…

为什么调用API总返回404,该如何调试

当调用一个应用程序接口&#xff08;API&#xff09;时&#xff0c;持续地收到“404 未找到”的错误&#xff0c;其核心原因在于客户端发起的“请求”&#xff0c;未能成功地&#xff0c;匹配到服务器上任何一个“真实存在”的、可供访问的“资源路径”。这本质上&#xff0c;是…

医疗信息化自主可控转型的实践探索 —— 以常德二院为例

目录 头雁领航 - 激发医疗新质生产力 核心支撑 - 电科金仓奠定数据底座 生态共建 - 携手护航医疗信创发展 信创产业发展是国家经济数字化转型、提升产业链发展的关键&#xff0c;是科技自立自强的核心基座&#xff0c;其本质是实现中国信息化产业的自主可控。医疗信创作为关…