element-upload 文件上传和图片上传

news2024/11/17 19:30:55

文件上传

    • element-upload介绍
    • 实际上的文件上传代码
      • 前端
      • java后端
    • 补充

element-upload介绍

element-ui是一个很常用的文件上传组件,他包括但不局限于只上传图片,很多时候用于系统的头像修改就是用这个组件
在官网element-ui(element-upload)有着完整的介绍,这里就不多做描述了,具体的内容可以看文档

实际上的文件上传代码

前端

 <el-upload ref="uploadExcel" action="后端的实际文件上传的接口地址" :limit="1"
                        :auto-upload="false" accept=".xlsx" :before-upload="beforeUploadFile" :on-change="fileChange"
                        :on-exceed="exceedFile" :on-success="handleSuccess" :on-error="handleError">
                        <el-button  type="success">导入成绩</el-button>
                        <el-button type="primary" @click="uploadClick">确 定</el-button>
                    </el-upload>

上面是简单的一个element-upload组件上传文件的一个基础布置。一开始我在文件上传这里一直显示接口报错,导致数据传输错误,也是在网上多番查看,才解决
相应的方法代码在下面

//导入成绩
         uploadClick() {
            this.$refs.uploadExcel.submit()
        },


        // 上传文件之前的钩子, 参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传
        beforeUploadFile(file) {
             console.log(file,"文件")
            const extension = file.name.substring(file.name.lastIndexOf('.') + 1)
            const size = file.size / 1024 / 1024
            if (extension !== 'xlsx') {
                this.$notify.warning({
                    title: '警告',
                    message: `只能上传Excel(即后缀是.xlsx)的文件`
                })
            }
            if (size > 10) {
                this.$notify.warning({
                    title: '警告',
                    message: `文件大小不得超过10M`
                })
            }
        },
        // 文件状态改变时的钩子
        fileChange(file, fileList) {
             console.log(file,"文件状态改变")
             console.log(fileList,"文件列表")
        },
        // 文件超出个数限制时的钩子
        exceedFile(files, fileList) {
            this.$notify.warning({
                title: '警告',
                message: `只能选择1 个文件,当前共选择了 ${files.length + fileList.length}`
            })
        },
        // 文件上传成功时的钩子
        handleSuccess(res, file, fileList) {
            console.log(res,"接口返回成功")
            // this.formData.url = res.data  //服务器返回的文件地址
            this.$message({
                message: '文件上传成功',
                type: 'success'
            })
            this.$refs.uploadExcel.clearFiles()// 清除上次上传记录
        },
        // 文件上传失败时的钩子
        handleError(err, file, fileList) {
            this.$message.error(err.msg)
        },

确定按钮的方法是在 Vue 组件中调用 Upload 组件的提交方法的方式。通常情况下,当你选择文件后,Upload 组件会自动触发上传操作。但有时你可能需要在其他操作或事件中手动触发上传,例如在点击某个按钮时上传文件。这时,你可以使用 this.$refs.uploadExcel.submit() 来手动触发上传操作。

请注意,调用 submit() 方法之前,确保已经选择了要上传的文件,否则可能会导致错误。
这里我之所以加一个按钮,进行触发,是因为我将自动上传设置成了false,如果你们想要自动上传的话,只需把auto-upload这个设置成true

java后端

@PostMapping("/import")
    public ResultVo importExcel(MultipartFile file){
        try{
            InputStream inputStream=file.getInputStream();
            String filename = file.getOriginalFilename();
            if(StringUtils.isBlank(filename)){
                return ResultVo.error("没有上传文件");
            }
            if (filename.lastIndexOf(".") != -1
                    && !".xlsx".equals(filename.substring(filename.lastIndexOf(".")))
                    && !".xls".equals(filename.substring(filename.lastIndexOf(".")))
            ) {
                return ResultVo.error("文件名格式不正确, 请使用后缀名为.xlsx的文件");
            }

            ExcelReader reader = ExcelUtil.getReader(inputStream);
            assembleReader(reader);
            List<Grade> gradeList = reader.readAll(Grade.class);
            for (Grade grade:gradeList
                 ) {
                String stuSno=grade.getStuSno();
                Student student = studentMapper.selectOne(Wrappers.<Student>lambdaQuery().eq(Student::getSno, stuSno));
                if(student==null){
                    return ResultVo.error(student.getSno()+"学号不存在,导入失败");
                }
                grade.setStuId(student.getId());
                grade.setId(IdTools.getId());
                grade.setCreateTime(new Date());
            }
            gradeService.saveBatch(gradeList);


        }
        catch (IOException e) {
            e.printStackTrace();
            return ResultVo.error("文件上传失败");
        }
        return ResultVo.success();
    }
    private void assembleReader(ExcelReader excelReader) {

        excelReader.addHeaderAlias("学号", "stuSno");
        excelReader.addHeaderAlias("学生姓名", "stuName");
        excelReader.addHeaderAlias("授课教师编号", "teaId");
        excelReader.addHeaderAlias("授课教师名称", "teaName");
        excelReader.addHeaderAlias("课程编号", "courseId");
        excelReader.addHeaderAlias("课程名称", "courseName");
        excelReader.addHeaderAlias("成绩", "score");
        excelReader.addHeaderAlias("学分", "credit");

    }

请注意,如果有写授权的话,一定要记得把授权放开,否则会报token无效(读不到有效的token)

补充

如果是上传图片的话,记得对应upload传递的参数名称
在这里插入图片描述
这个name是用来设置文件上传的字段名的,如果你的后端接收的字段名是image但是你没有做修改,前端传的字段名是这个name,并且会有一种上传成功的假象,他返回的图片url前面会加上blob前缀。
就是因为这个name没有修改导致我当时找问题找了很久,因为明明显示图片已经做了修改,但是存在数据库中的url就是多了前缀,而且浏览器一刷新就显示图片加载异常

所以大家一定要注意细节,否则就容易像我一样,因为这个,导出debug,最后还是求助了大佬才解决了。哭死

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

区块链游戏解说:什么是 Arcade Champion

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;Arcade Champion Dashboard 什么是 Arcade Champion Arcade Champion 代表了移动游戏世界的重大革新。它将经典街机游戏的怀旧与创新元素结合在一起&#xff0c;包括 NF…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-33-处理https 安全问题或者非信任站点-上篇

1.简介 这一篇宏哥主要介绍playwright如何在IE、Chrome和Firefox三个浏览器上处理不信任证书的情况&#xff0c;我们知道&#xff0c;有些网站打开是弹窗&#xff0c;SSL证书不可信任&#xff0c;但是你可以点击高级选项&#xff0c;继续打开不安全的链接。举例来说&#xff0c…

redis中的分布式锁(setIfAbsent)(expire)

目录 应用场景 代码实例1&#xff1a; 代码实例2&#xff1a; setIfAbsent&#xff1a; expire&#xff1a; 举例说明&#xff1a; 代码实例3&#xff1a; 代码实例4&#xff1a; 还是一个同事问的一个问题&#xff0c;然后闲着没事就记录下来了。多人操作同一个保单&a…

(Linux学习二)文件管理基础操作命令笔记

Linux目录结构&#xff1a; bin 二进制文件 boot 启动目录 home 普通用户 root 超管 tmp 临时文件 run 临时运行数据 var 日志 usr 应用程序、文件 etc 配置文件 dev 文件系统 一、基础操作 在 Linux 终端中&#xff0c;你可以使用以下命令来清屏&#xff1a; clear 命令&am…

ubuntu2204部署hbase2.3.7

开启root 修改root用户的密码 sudo passwd rootSSH放行 sudo sed -i s/^#\?PermitRootLogin.*/PermitRootLogin yes/g /etc/ssh/sshd_config; sudo sed -i s/^#\?PasswordAuthentication.*/PasswordAuthentication yes/g /etc/ssh/sshd_config;重启服务 sudo service ssh…

IDEA利用鼠标调整字体大小

就可以按住ctrl和鼠标调节代码字体的大小啦&#xff01; 如果有用&#xff0c;记得给我来个赞~ 谢啦&#xff01;

什么是生成式人工智能?

近年来&#xff0c;人工智能取得了重大进展&#xff0c;其中发展迅速的领域之一就是生成式人工智能。生成式人工智能是人工智能和深度学习的一个子领域&#xff0c;主要使用机器学习技 术根据现有数据训练算法和模型&#xff0c;生成诸如图像、文本、音乐、视频等新内容。 要更…

nginx 反向代理 与缓存功能

一 理论说明 &#xff08;一&#xff09;反向代理简介 反向代理&#xff1a;reverse proxy&#xff0c;指的是代理外网用户的请求到内部的指定的服务器&#xff0c;并将数据返回给用户的一种方式&#xff0c;这是用的比较多的一种方式。 即 代理服务机 Nginx 除了可以在企…

linux系统-----------搭建LNMP 架构

PHP(Hypertext Preprocessor 超文本预处理器)是通用服务器端脚本编程语言&#xff0c;主要用于web开发实现动态web页面&#xff0c;也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时&#xff0c;php还提供了一个命令行接口&#xff0c;因此&#xff0c;其也可…

如何使用便签快速分类工作待办事项

在日常工作和生活中&#xff0c;我们经常需要处理各种各样的待办事项。而有效地分类这些任务&#xff0c;可以帮助我们更好地管理时间和提高工作效率。使用便签是一种简单而实用的方法&#xff0c;下面将介绍如何利用好用便签来快速分类工作待办事项。 首先&#xff0c;你可以…

软考中级1(数据库系统工程师)

1.程序计数器 保存待读取指令的地址 累加器 保存原操作数和结果 2.DMA方式不需要CPU&#xff0c;由DMA控制器直接控制数据的传送 3.数据位n位&#xff0c;校验位k位&#xff0c;海明码满足的关系&#xff1a;2^k-1>nk 4.高速缓存Cache&#xff1a;位于CPU和主…

大数据分布式计算工具Spark实战讲解

PySpark 什么是PySpark&#xff1f; Spark是Apache基金会旗下的顶级开源项目&#xff0c;用于对海量数据进行大规模分布式计算。 PySpark是Spark的Python实现&#xff0c;是Spark为Python开发者提供的编程入口&#xff0c;用于以Python代码完成Spark任务的开发 PySpark不仅可…

三天学会阿里分布式事务框架Seata-SpringCloud Alibaba分布式基础案例搭建

锋哥原创的分布式事务框架Seata视频教程&#xff1a; 实战阿里分布式事务框架Seata视频教程&#xff08;无废话&#xff0c;通俗易懂版&#xff09;_哔哩哔哩_bilibili实战阿里分布式事务框架Seata视频教程&#xff08;无废话&#xff0c;通俗易懂版&#xff09;共计10条视频&…

记录工作中遇见问题、学习项

1、判空操作 Demo demo Optional .ofNullable(demoService.getById(id)) .orElseThrow(() -> new ServiceException("不存在id为" id "的数据")); 2、SQL方面 1、group by : GROUP BY 子句必须放在 WHERE 子句中的条件之后&#…

网络:IPv6

1、由于IPv4地址资源枯竭&#xff0c;所以产生了IPV6。 版本长度地址数量IPv432 bit4 294 967 296IPv6128 bit340 282 366 920 938 463 374 607 431 768 211 456 2、IPv6的基本报头在IPv4报头基础上&#xff0c;增加了流标签域&#xff0c;去除了一些冗余字段&#xff0c;使报…

Apache SeaTunnel 及 Web 功能部署指南(小白版)

在大数据处理领域&#xff0c;Apache SeaTunnel 已成为一款备受青睐的开源数据集成平台&#xff0c;它不仅可以基于Apache Spark和Flink&#xff0c;而且还有社区单独开发专属数据集成的Zeta引擎&#xff0c;提供了强大的数据处理能力。随着SeaTunnel Web的推出&#xff0c;用户…

Python异步IO库之uvloop使用详解

概要 在Python中,异步编程已经成为处理高并发和IO密集型任务的主要方式之一。而uvloop库则是一个专门针对异步IO操作进行优化的库,它能够显著提高异步程序的性能。本文将深入探讨uvloop库的使用方法、功能特性以及如何利用它来加速异步IO编程。 什么是uvloop库? uvloop是一…

探讨:围绕 props 阐述 React 通信

在 ✓ &#x1f1e8;&#x1f1f3; 开篇&#xff1a;通过 state 阐述 React 渲染 中&#xff0c;以 setInterval 为例&#xff0c;梳理了 React 渲染的相关内容。 &#x1f4e2; 本篇会 ✓ &#x1f1e8;&#x1f1f3; 围绕 props 阐述 React 通信 props React 组件使用 pro…

存储xss实现获取cookie(本地实战)

实战更能体验收获&#xff01;&#xff01;&#xff01; 环境准备&#xff1a; 1.phpstudy 2.dvwa靶场 实战 首先我们在phpstudy指定的localhost网站目录下编写一个xss.php文件&#xff0c;内容如下&#xff1a; <?php $cookie $_GET[cookie]; $ip getenv (REMOTE_…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的活体人脸检测系统(Python+PySide6界面+训练代码)

摘要&#xff1a;本篇博客详细讲述了如何利用深度学习构建一个活体人脸检测系统&#xff0c;并且提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并进行了与前代算法YOLOv7、YOLOv6、YOLOv5的细致对比&#xff0c;展示了其在图像、视频、实时视频流和批量文件处…