element-plus中,Upload上传组件的使用 + 后端处理

目录

一. 案例一:用户更换个人头像

1.前端实现

2.后端实现

①引入阿里云oss的依赖

②编写AliOSSUtils工具类

③编写controller层

④编写service层

⑤编写mapper层

3.效果展示

4.重点理解

结语


一. 案例一:用户更换个人头像

1.前端实现

<!-- 预览登录用户头像的弹窗 -->
<el-dialogv-model="showAvatar"title="头像预览"width="30%"append-to-body
><!-- 文件上传组件 --><el-upload:action="`http://localhost:8848/api/user/${user.id}/updateUserAvatar`"name="userAvatar":show-file-list="false":before-upload="beforeUpload":on-success="handleAvatarSuccess"> <!-- 当前的用户头像 --><!-- 如果此时该用户有头像,则显示头像 --><img v-if="user.avatar != null" :src=user.avatar alt="头像" title="点击更换头像" style="width: 100%;"/><!-- 如果此时该用户没有头像,则显示自定义span --><span v-else style="display: inline-block;width:480px;height:300px;background-color: #EEEEEE;" title="暂无头像,点击上传头像"><el-icon style="margin-top: 140px;margin-left:230px"><icon-picture /></el-icon></span></el-upload></el-dialog><script setup>
import {ref} from 'vue'
/* 导入element-plus图标 */
import { Picture as IconPicture } from '@element-plus/icons-vue'/* 使用pinia的UserStore.js中的数据user */
import userStore from "@/store/UserStore";
const userStoreInfo = userStore();
const user = userStoreInfo.user;//该user中,存储了当前用户的全部信息(包含用户头像url)。
//alert(JSON.stringify(user))//头像上传前的检查工作(控制哪些类型的文件能上传)
const beforeUpload = (file) => {// 允许的文件类型const allowedTypes = ['image/png', 'image/jpg', 'image/jpeg'];const isLt2M = file.size / 1024 / 1024 < 2;if (!allowedTypes.includes(file.type)) {/* alert('只能上传 PNG、JPG 或 JPEG 格式的文件'); *///提示错误信息ElMessage.error("只能上传 PNG、JPG 或 JPEG 格式的图片~")//阻止上传return false;}if (!isLt2M) {/* alert('头像图片大小不能超过 2MB'); *///提示错误信息ElMessage.error("图片大小不能超过 2MB~")//阻止上传return false;}//如果满足上述的所有请求,则允许上传return true;
};//更改用户头像成功后,触发的函数
const handleAvatarSuccess = (response, uploadFile) => {//alert(JSON.stringify(response));//alert(JSON.stringify(uploadFile));//提示更换头像成功ElMessage.success(response.message);//将pinia的userStore.js中的当前登录用户的头像改成最新的user.avatar = response.data;//关闭头像预览对话框showAvatar.value = false;
}</script>

解读:

①<el-upload></el-upload>是文件上传组件,该标签包着啥并不重要,重要的是一点击就会让你选择本地图片。

②:action表示该上传文件的请求对应的后端接口,不受axios的公共前缀影响,因此要写全后端接口地址。选择本地图片后,自动就会发出这个请求,我们无需操作。

③name="userAvatar"表示该文件对象的名称,后端使用@RequestParam("userAvatar") MultipartFile userAvatar来接收这个文件对象。

④:before-upload表示发送文件上传请求前,要进行的检查工作,比如:文件格式、大小是否符合我们的预期,如果不符合直接拦截。

⑤:on-success表示文件上传成功后,触发的函数,我们在里面可以来点成功提示等等。

2.后端实现

①引入阿里云oss的依赖


<!--阿里云OSS存储所需的四个依赖(JDK版本是17的话,对应这四个依赖)-->
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency>
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version>
</dependency>
<dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version>
</dependency>
<dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version>
</dependency>

②编写AliOSSUtils工具类

/*** 阿里云 OSS 工具类:将前端发送的文件对象传入该工具类的静态方法upload中,就会将其存入阿里云oss并返回其url地址。*/
@Component //将该工具类交给spring的IOC容器管理,使用时直接注入即可
public class AliOSSUtils {private String endpoint = "https://oss-cn-beijing.aliyuncs.com";//这是北京,根据自己的来private String accessKeyId = "你自己的ID";private String accessKeySecret = "你自己的Secret";private String bucketName = "你自己的bucket";/*** 实现上传图片到OSS*/public String upload(MultipartFile file) throws IOException {//获取上传的文件的输入流InputStream inputStream = file.getInputStream();//避免文件覆盖(生成唯一的文件名:UUID)String originalFilename = file.getOriginalFilename();//获取原文件的名称String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));//上传文件到 阿里云OSS服务器OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, fileName, inputStream);//生成文件访问路径urlString url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;//关闭ossClientossClient.shutdown();//返回该文件的urlreturn url;}}

③编写controller层

    /*** 更改用户头像(文件上传一般都用Post请求)*/@PostMapping ("/{id}/updateUserAvatar")public Result updateUserAvatar(@PathVariable Integer id, @RequestParam("userAvatar") MultipartFile userAvatar) throws IOException {//System.out.println(id + "+" + userAvatar.getOriginalFilename());String avatarUrl = userService.updateUserAvatar(id, userAvatar);if(avatarUrl !=null){return new Result(200, "更换头像成功", avatarUrl);}else{return new Result(400, "更换头像失败");}}

④编写service层

service层:

    //更改用户头像public String updateUserAvatar(Integer id, MultipartFile userAvatar) throws IOException;

serviceImpl层:

    //注入工具类AliOSSUtils的实例@Autowiredprivate AliOSSUtils aliOSSUtils;//更改用户头像public String updateUserAvatar(Integer id, MultipartFile userAvatar) throws IOException {//将前端传来的图片,存入阿里云平台,并获取该图片的url地址String avatarUrl = aliOSSUtils.upload(userAvatar);System.out.println("最新的头像url:" + avatarUrl);//将该用户的最新头像的url存入数据库int i = userMapper.updateUserAvatar(id, avatarUrl);//返回最新头像的url地址return avatarUrl;}

⑤编写mapper层

    //根据id,修改用户头像@Update("update user set avatar = #{avatarUrl} where id = #{id}")public int updateUserAvatar(Integer id, String avatarUrl);

3.效果展示

4.重点理解

①前端el-upload的name属性,表示上传的文件对象的名称,后端就要用该名称来接收,如下:

②后端接收文件对象的类型为MultipartFile,这是Spring官方定义的。下面是该类型的几种方法:

③要理解AliOSSUtils工具类的核心:接收一个文件对象,将其存入阿里云OSS中,并返回其URL地址。

④我们在service层中,将前端传来的头像存入阿里云oss并获得其url后,应该将这个url存入数据库中,这样我们就可以查询数据库中的url来展示在前端页面中。

⑤前端发送文件上传请求的时机:当用户选择一个图片后,就会自动发出请求,我们无需插手。(后期也可以自定义触发时机)

⑥文件上传一般都是发送post请求。

⑦el-upload组件的action,代表文件请求对应的后端接口地址,如果需要动态拼接的话,可以加上冒号和飘号`。

结语

以上就是element-plus中,Upload上传组件的使用 + 后端处理的大致流程。

这只是一个启蒙案例,后期可以自己精进。

喜欢本篇文章的话,可以留个免费的关注~~

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

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

相关文章

HarmonyOS-ArkUI Rcp模块类关系梳理

前言 本文重点解决的是&#xff0c;按照官网学习路径学习Tcp模块内容时&#xff0c;越看越混乱的问题。仿照官网案例&#xff0c;书写代码时&#xff0c;产生的各种疑惑。比如&#xff0c;类与类之间的关系&#xff0c;各种配置信息究竟有多少&#xff0c;为什么越写越混乱。那…

【云计算物理网络】数据中心网络架构设计

云计算的物理基础&#xff1a;数据中心网络架构设计 一、技术背景&#xff1a;从“三层架构”到“云原生网络”二、技术特点&#xff1a;云数据中心网络的四大支柱三、技术细节&#xff1a;CLOS架构的实现挑战四、未来方向&#xff1a;从“连接设备”到“感知服务”结语&#x…

window11 通过cmd命令行安装 oh my zsh 的教程

步骤 1&#xff1a;安装 WSL 2 和 Ubuntu 1. 以管理员身份打开 CMD wsl --install -d Ubuntu此命令会自动安装 WSL 2 和 Ubuntu 发行版。 安装完成后重启系统。 初始化 Ubuntu 在开始菜单中打开 Ubuntu&#xff0c;设置用户名和密码。 步骤 2&#xff1a;在 WSL 的 Ubunt…

gdb 调试命令记录

启动调试 gdb ./待调试的程序 #不带参数 (gdb) run #带参数 gdb --args ./your_program arg1 arg2 arg3 (gdb) run arg1 arg2 arg3 #图形化代码界面 (gdb) layout src基础调试命令 命令缩写作用run [args]r运行程序&#xff08;可带命令行参数&#xff09;break <locatio…

STM32F103低功耗模式深度解析:从理论到应用实践(上) | 零基础入门STM32第九十二步

主题内容教学目的/扩展视频低功耗模式什么是低功耗&#xff0c;模式介绍&#xff0c;切换方法。为电池设备开发做准备。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、低功耗模式概述1.1 为什么需要低功耗模式&#xff1f;1.2 基本实现原理 二、低功耗模式的本…

JavaScript instanceof 运算符全解析

JavaScript instanceof 运算符全解析 核心语义: 判断一个对象(object)是否属于某个构造函数(constructor)或类的实例,基于原型链(prototype chain)实现类型检测。 一、JavaScript 中的基础用法 1. 语法结构 object instanceof constructor 返回值:布尔值(true/fal…

电脑基础之word基础操作

word是常用的办公软件之一&#xff0c;用于文档编辑&#xff0c;如合同/报告撰写、论文等‌。 一、简介 word文档最早由微软推出&#xff0c;通过Microsoft Office Word软件创建和编辑。由于涉及版权付费问题&#xff0c;大多数个人使用盗版软件。后来金山出了WPS office免费软…

深度解析Python代码中的广告信息提取与JSON处理

哈喽,大家好,我是木头左! 在当今数字化时代,广告无处不在,而从广告中提取关键信息并进行处理则成为了一项重要的技能。本文将深入剖析一段Python代码,该代码旨在从给定的JSON格式字符串中提取广告相关信息,并对其进行解析和处理。通过这段代码,将展示如何运用Python的j…

base64在线解码工具

我们经常会用到base64编码&#xff0c;相应的base64解码成为日常必备&#xff0c;所有我们需要拥有一个base64在线解码工具 base64在线解码工具

Linux——进程信号(3)(信号保存与信号捕捉)

进程信号3 信号保存信号相关概念详解信号集&#xff08;sigset_t&#xff09;及操作函数详解 信号捕捉信号捕捉的详细流程解析信号捕捉的核心概念信号捕捉的完整流程&#xff08;以 SIGQUIT 为例&#xff09; 信号保存 信号相关概念详解 1.核心概念 (1) 信号递达&#xff08…

批量在 txt 记事本文件的指定位置插入行,如在最末尾位置插入行

我们在网上下载的小说经常可以看到内容中每隔多少行都会现一些网站名称和联系方式等广告信息&#xff0c;这些都是固定或者随机插入在小说正文中的。那是怎么样实现在文本文件中指定位置插入这些行的呢&#xff1f;今天就给大家介绍一下如何在 txt 记事本文件或者其它类型的文本…

python的内存管理机制

目录 内存分配方式自动内存管理内存分配策略 垃圾回收机制引用计数垃圾回收对象创建和引用关系引用计数的状态删除变量 标记 - 清除垃圾回收 内存分配的区域划分栈内存堆内存 内存管理的优化内存池技术对象共享 Python 的内存管理机制是其运行效率和安全性的重要保障&#xff0…

火山引擎coze用户市场

火山引擎 **Coze**&#xff08;扣子&#xff09;的用户市场主要集中在 **需要快速构建和部署智能对话应用的企业及开发者群体**&#xff0c;覆盖多个行业与场景。以下是具体分析&#xff1a; --- ### **一、核心用户群体** 1. **企业用户** - **互联网/科技公司**&#…

Java 责任链模式 详解

责任链模式详解 一、责任链模式概述 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式&#xff0c;它允许你将请求沿着处理链传递&#xff0c;直到有一个处理者能够处理它为止。这种模式解耦了请求的发送者和接收者&#xff0c;使多个对象都有机会处理请求。…

【C++初阶】--- string类

1.STL简介 STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 2.string类 2.1什么是string类 std::string 类是 C 标准库中用于处理和操作字符串…

Ubuntu 20.04 中 Git 的安装、配置和基本操作指南

本文为经验 所谈 使用版本为ubuntu20.04 1 ubuntu的git初始化 1.安装git sudo apt-get install git 可通过git --version 命令查看&#xff0c;正常输出git版本号即安装成功。 2.配置用户名和邮箱名 git config --global user.name "Your Name" git config --globa…

conda 激活环境vscode的Bash窗口

多份conda环境注意事项&#xff0c;当时安装了两个conda环境&#xff0c;miniconda和conda&#xff0c;导致环境总是冲突矛盾。初始化时需要更加注意。 $ C:/Users/a_hal/miniconda3/Scripts/conda.exe init bash能够显示用哪里的conda环境命令执行。 然后直接conda activate…

Mac下小智AI本地环境部署

可以进行聊天、编写程序、播放歌曲等等的小智语音聊天小助手&#xff0c;在Mac环境下修改源代码&#xff0c;值得拥有。本篇内容主要讲解Mac下环境的搭建&#xff0c;WebSocket的修改。注&#xff1a;环境python3.12.0、ESP-IDF5.4.0、开发板ESP32S3。 目录 1.Git安装2.Python…

Linux安装Cmake (Centos 7.9)

cmake安装 这个虽然已经更新到了4.0.0版本了&#xff0c;但是我们要用3.5版本的&#xff0c;因为这个比较稳定 官方地址&#xff1a;https://github.com/Kitware/CMake/releases/tag/v3.5.0&#xff0c;选择那个cmake-3.5.0-Linux-x86_64.tar.gz下载&#xff0c; 首先解压文…

基于 SpringBoot 的旧物置换网站

收藏关注不迷路&#xff01;&#xff01; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮助更多…