upload 文件自动上传写法,前后端 下载流文件流
<el-uploadv-model:file-list="fileList":action="app.api+'/student/student/import'":headers="{// 'Content-Type': 'multipart/form-data;boundary=----split-boundary', 此处切记不要加,否则会造成后端报错 Required request part 'file' is not present 'token':token}"name="file"//此处默认为fileclass="upload-demo"@on-success="handleSuccess":on-error="handleAvatarSuccess":limit="3":on-progress="beforeAvatarUpload">
<!--:auto-upload="false"--><!-- :http-request="replaceRes"--><span v-if="jinDu"><el-progress style="width: 245px; height: 19px" :text-inside="true" :stroke-width="20":percentage="percentage"/></span><span v-if="isUpload" style="color: #59c2c7;cursor:pointer;"@click="uploadChangeValue">导入学生学籍信息</span><template #tip><span style="color: #ff8282; margin-left: 20px">{{ importText }}</span></template></el-upload>
<script lang="ts" setup>//此处后端穿了一个流给前端,所以需要解析一下,然后赋值给一个按钮,在点击时候才下载!!!
const handleSuccess = (response: any) => {console.log(response)if (Object.values(response.headers)[0] == 'application/vnd.ms-excel;charset=UTF-8') {const url = window.URL.createObjectURL(new Blob([response.data]));// 创建a标签,并隐藏a标签let link = document.createElement('a')link.style.display = 'none'// a标签的href属性指定下载链接link.href = url//setAttribute() 方法添加指定的属性,并为其赋指定的值// 后缀格式.csv/.xsls要和需要和后端返回格式相同,这里以.csv为例link.setAttribute('download', '文件名称.xlsx')document.body.appendChild(link)link.click()document.body.removeChild(link)}
};//此处用于实时监听进度条进度
const beforeAvatarUpload = (event: any) => {let loadProgress = Math.floor(event.percent); //这就是当前上传的进度//可以进行其他逻辑percentage.value = loadProgress;importText.value = "学籍信息导入中……";if (percentage.value == 100) {importText.value = "学籍导入成功!"}
};
</script>
@PostMapping("import")@ApiOperation("导入")@RequiresPermissions("student:student:import")@ApiImplicitParam(name = "file", value = "文件", paramType = "query", dataType = "file")public void importExcel(@RequestParam("file") MultipartFile file, HttpServletResponse response) throws Exception {UserDetail userDetail = SecurityUser.getUser();//保存所有的表单信息、如果表达有错误、将返回给客户端if (userWithErrorListInMap == null) {userWithErrorListInMap = new HashMap<>();}//每次都清空数据userWithErrorListInMap.put(userDetail.getId(), new ArrayList<>());ZsRef<Boolean> hasError = new ZsRef<>();new ExcelServiceListener<StudentExcel, StudentEntity>(studentService, file.getInputStream()) {private List<RegionEntity> regionList;/*** 地区编码 去掉末尾的数字0, 用于判断权限*/private String userRegionCodeForPermission;private SchoolEntity schoolForPermission;@Overridepublic void invoke(StudentExcel data, AnalysisContext context) {if (regionList == null) {regionList = regionService.selectList(new HashMap<>());}if (userDetail.getRegionCode() != null) {//去掉地区编码后面的0userRegionCodeForPermission = userDetail.getRegionCode().replaceAll("0+?$", "");}if (userDetail.getSchoolCode() != null) {schoolForPermission = schoolService.selectByParams("schoolCode", userDetail.getSchoolCode());}// 校验姓名if (data.getName() == null) {hasError.value = true;data.setName(data.getName() + "##名字不能为空, 长度最多四汉字");}// 校验性别if (data.getGender() == 2) {hasError.value = true;data.setGenderStr(data.getGenderStr() + "##性别只能是(男、女)中的一个");}// 校验身份证号if (isEmpty(data.getIdCard()) || data.getIdCard().length() != 18) {hasError.value = true;data.setName(data.getName() + "##身份证长度18位");}if (isEmpty(data.getNation())) {hasError.value = true;data.setNation(data.getNation() + "##民族不能为空");}// ************************ 校验地区 *********************************// 判断地区表中是否包含含这一项RegionEntity region1 = null, region2 = null;for (RegionEntity item : regionList) {if (data.getRegion1() != null && data.getRegion1().contains(item.getName())) {region1 = item;}if (data.getRegion2() != null && data.getRegion2().contains(item.getName())) {region2 = item;}}// RegionEntity region = regionList.stream().filter(r -> r.getName().contains(data.getRegion())).findFirst().orElse(null);if (region1 == null) {hasError.value = true;data.setRegion1(data.getRegion1() + "##城市不存在");}if (region2 == null) {if (data.getRegion1().contains("济源")) {//济源没有区县} else {hasError.value = true;data.setRegion2(data.getRegion2() + "##区县不存在");}}if (region1 != null && region2 != null) {data.setRegionCode(region2.getCode());//判断地区和学校 是否具备权限if (isNotEmpty(userDetail.getRegionCode())) {if (String.valueOf(data.getRegionCode()).startsWith(userRegionCodeForPermission)) {//具备权限} else {hasError.value = true;data.setRegion2(data.getRegion2() + "##不具备该地区的权限");}}}//判断是否具备该学校的权限if (isNotEmpty(userDetail.getSchoolCode())) {if (isEquals(schoolForPermission.getName(), data.getSchoolName())) {//具备权限} else {hasError.value = true;data.setSchoolName(data.getSchoolName() + "##不具备该学校的权限");}} else {//不需要判断学校权限}if (isEquals(hasError.value, true)) {userWithErrorListInMap.get(userDetail.getId()).add(data);} else {//没有错误的才添加super.list.add(data);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {if (isEquals(hasError.value, true)) {// 有错误, 不入库} else {studentService.saveStudentWidthSchoolAndClass(super.list);}}}.start(2);if (Objects.equals(hasError.value, true)) {String errorFileName = file.getOriginalFilename().replace(".xlsx", "错误提示.xlsx");export(response, errorFileName, userWithErrorListInMap.get(userDetail.getId()));} else {PrintWriter pw = response.getWriter();//逻辑删除导入学籍时学籍不存在的学校班级(当前学期)schoolService.deleteBySchoolCode();gradeClassService.deleteByClassCode();//恢复导入学籍时学籍存在但逻辑删除的学校班级(当前学期)schoolService.updateBySchoolCode();gradeClassService.updateByClassCode();pw.write(ZsJson.toJson(new Result<>()));pw.close();}System.out.println("excel解析完成");}
下载一个后端返回的流文件


const downLoadExport=()=>{axios({method: 'post',url: baseUrl+"/electric/electricassets/download/assets",headers: {"Content-Type": "application/json;charset=UTF-8","token":getToken()},responseType: 'blob'}).then(response => {if (Object.values(response.headers)[0]=='application/vnd.ms-excel;charset=UTF-8'){const url = window.URL.createObjectURL(new Blob([response.data]));// 创建a标签,并隐藏a标签let link = document.createElement('a')link.style.display = 'none'// a标签的href属性指定下载链接link.href = url//setAttribute() 方法添加指定的属性,并为其赋指定的值// 后缀格式.csv/.xsls要和需要和后端返回格式相同,这里以.csv为例link.setAttribute('download', '文件名称.xlsx')document.body.appendChild(link)link.click()document.body.removeChild(link)}})
}
相关文章:
upload 文件自动上传写法,前后端 下载流文件流
<el-uploadv-model:file-list"fileList":action"app.api/student/student/import":headers"{// Content-Type: multipart/form-data;boundary----split-boundary, 此处切记不要加,否则会造成后端报错 Required request part file is…...
Python文件、文件夹操作汇总
目录 一、概览 二、文件操作 2.1 文件的打开、关闭 2.2 文件级操作 2.3 文件内容的操作 三、文件夹操作 四、常用技巧 五、常见使用场景 5.1 查找指定类型文件 5.2 查找指定名称的文件 5.3 查找指定名称的文件夹 5.4 指定路径查找包含指定内容的文件 一、概览 在…...
CHM Viewer Star 6.3.2(CHM文件阅读)
CHM Viewer Star 是一款适用于 Mac 平台的 CHM 文件阅读器软件,支持本地和远程 CHM 文件的打开和查看。它提供了直观易用的界面设计,支持多种浏览模式,如书籍模式、缩略图模式和文本模式等,并提供了丰富的功能和工具,如…...
【GIT】git分支命令,使用分支场景介绍git标签介绍,git标签命令,git标签使用的场景git查看提交历史
目录 一,git分支命令,使用分支场景介绍 二,git标签介绍,git标签命令,git标签使用的场景 三,git查看提交历史 前言: 今天我们来聊聊关于Git 分支管理。几乎每一种版本控制系统都以某种形式支持…...
Zeitgeist ZTG Token以及其预测市场加入Moonbeam生态
波卡上的首选多链开发平台Moonbeam宣布与Zeitgeist达成XCM集成,将ZTG Token引入Moonbeam。此集成将使波卡内的Moonbeam和Zeitgeist网络之间的流动性得以流动,并通过Moonbeam的互连合约实现远程链集成。 Zeitgeist是一个基于波卡的Substrate区块链框架构…...
AM@方向导数概念和定理
文章目录 abstract方向导数二元函数方向导数偏导数是方向导数的特例偏导数存在一定有对应的方向导数存在方向导数存在不一定有偏导数存在例 三元函数方向导数例 方向导数存在定理和计算公式证明二元函数三元函数 abstract 方向导数的概念,定理和计算公式方向导数是对偏导的补充…...
微信小程序隐私政策不合规,应当由用户自主阅读后自行选择是否同意隐私政策协议,不得默认强制用户同意
小程序隐私政策不合规,默认自动同意《用户服务协议》及《隐私政策》,应当由用户自主阅读后自行选择是否同意隐私政策协议,不得默认强制用户同意,请整改后再重新提交。 把 登录代表同意《用户协议》和《隐私政策》 改为 同意《用…...
Python中如何判断两个对象的内存地址是否一致?
目录 一、引言 二、Python的内存管理 三、对象的比较 四、使用id函数判断内存地址 五、总结 一、引言 在Python中,我们经常需要比较两个对象是否是同一个对象,或者说它们是否在内存中占据同一位置。在理解这个问题之前,我们需要了解Pyt…...
唯美仙侠3D手游2023【仙变3】画面精美/linux服务端+双端+GM后台+运营后台+详细教程
搭建资源下载地址:https://www.ldmzy.com/6618/6618.html...
React组件通信:如何优雅地实现组件间的数据传递
在React应用中,组件通信是至关重要的一部分。通过合适的数据传递和交互方式,我们可以构建出更加灵活和高效的前端应用。本文将介绍React组件通信的各种方式,并提供代码实现,帮助你更好地理解和应用这些技术。 1. 使用props进行父子…...
数据分析实战 | 逻辑回归——病例自动诊断分析
目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 八、模型评价 九、模型调参 十、模型预测 一、数据及分析对象 CSV文件——“bc_data.csv” 数据集链接:https://download.csdn.net/d…...
Eigen::Matrix<double,3,1> F;Eigen::MatrixXd F (3, 2);这两行代码有什么区别?
这两行代码的区别在于定义的矩阵 F 的类型和维度不同。 第一行: Eigen::Matrix<double,3,1> F;这行代码创建了一个3x1的矩阵 F,其中元素类型为 double。这是一个静态大小的矩阵,其维度在编译时确定。 第二行: Eigen::Ma…...
Java Agent - 应用程序代理-笔记
Java Agent - 应用程序代理-笔记 概述说明 Java Agent 又叫做 Java 探针,该功能是 Java 虚拟机提供的一整套后门,通过这套后门可以对虚拟机方方面面进行监控与分析,甚至干预虚拟机的运行。 是在 JDK1.5 引入的一种可以动态修改 Java 字节码…...
gird 卡片布局
场景一:单元格大小相等 这承载了所有 CSS Grid 中最著名的片段,也是有史以来最伟大的 CSS 技巧之一: 等宽网格响应式卡片实现 .section-content {display: grid;grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));gap: 10px; …...
C#医学检验室(LIS)信息管理系统源码
LIS:实验室信息管理系统 (Laboratory Information Management System简称:LIS)。 LIS 是面向医院检验科、检验中心、动物实验所、生物医疗研究所等科研单位研发的集数据采集、传输、存储、分析、处理、发布等功能于一体的信息管理系统。 一、完善的质控: 从样本管理…...
建行广东江门分行:科技赋能,数据助力纠“四风”
为进一步深化落实中央八项规定精神,持续加大“四风”问题查处力度,建行驻江门市分行纪检组根据《广东省分行贯彻落实中央八项规定精神持之以恒纠治“四风”实施方案》(建粤党发〔2023〕1号)安排,对驻在市分行开展“四风…...
3164:练27.1 叮叮当当 《信息学奥赛一本通编程启蒙(C++版)》
3164:练27.1 叮叮当当 《信息学奥赛一本通编程启蒙(C版)》 【题目描述】 松鼠老师和尼克玩报数游戏。松鼠老师数到2的倍数时,尼克就说“叮叮”;松鼠老师数到3的倍数时,尼克就说“当当”;松鼠老…...
立体库堆垛机放货动作控制程序功能
放货动作程序功能块 DB11.DBX0.0 为左出货台有货 DB11.DBX1.0 为右出货台有货 左出货台车就位 DB11.DBX0.2 右出货台车就位 DB11.DBX1.2 左出货台车就位 DB11.DBX0.2 右出货台车就位 DB11.DBX1.2 左出货台车就位 DB11.DBX0.2 右出货台车就位 DB11.DBX1.2...
MySQL数据库干货_22——MySQL的用户管理
MySQL的用户管理 MySQL 是一个多用户的数据库系统,按权限,用户可以分为两种: root 用户,超级管理员,和由 root 用户创建的普通用户。 用户管理 创建用户 CREATE USER username IDENTIFIED BY password;查看用户 S…...
基于ubuntu 22, jdk 8x64搭建图数据库环境 hugegraph--google镜像chatgpt
基于ubuntu 22, jdk 8x64搭建图数据库环境 hugegraph download 环境 uname -a #Linux whiltez 5.15.0-46-generic #49-Ubuntu SMP Thu Aug 4 18:03:25 UTC 2022 x86_64 x86_64 x86_64 GNU/Linuxwhich javac #/adoptopen-jdk8u332-b09/bin/javac which java #/adoptopen-jdk8u33…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
