当前位置: 首页 > news >正文

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

目录

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

1.前端实现

2.后端实现

①引入阿里云oss的依赖

②编写AliOSSUtils工具类

③编写controller层

④编写service层

⑤编写mapper层

3.效果展示

4.重点理解

结语


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

1.前端实现

<!-- 预览登录用户头像的弹窗 -->
<el-dialog
  v-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);

        //生成文件访问路径url
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        //关闭ossClient
        ossClient.shutdown();
        //返回该文件的url
        return 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的实例
    @Autowired
    private 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.dtcms.com/a/107268.html

相关文章:

  • DMA在SPI和I2C通信中的应用详解
  • 解锁异步编程新姿势:CompletableFuture 深度探秘
  • java根据集合中对象的属性值大小生成排名
  • [NOIP 1999 提高组] 导弹拦截
  • C++ STL简单的几个容器
  • I²C总线高级特性与故障处理分析
  • 【leetcode100】每日温度
  • OpenCV 从入门到精通(day_04)
  • 面向对象
  • python实现简单fast-cgi服务,对接到nginx
  • 蓝桥云客 刷题统计
  • 持续集成与Jenkins安装使用教程
  • 分布式锁方案-Redisson
  • Linux命令-tar
  • 使用 MapReduce 进行高效数据清洗:从理论到实践
  • Linux内核中ARP协议的实现与dev_addr字段的作用
  • LabVIEW 调用 Python 函数
  • SAP-ABAP:ABAP `LEAVE LIST-PROCESSING` 深度解析
  • 天梯赛 L2-023 图着色问题
  • ai prompt工程师认证
  • AT_abc306_b [ABC306B] Base 2
  • 【工具变量】全国分省低空经济高质量发展数据(2012-2023年)
  • Word 插入无页眉页码的空白页(即插入奇数页)
  • WebSocket connection failed 解决
  • 基于机器学习的三国时期诸葛亮北伐失败因素量化分析
  • 数学知识集锦
  • Ubuntu24.04-中文输入法的切换
  • 批量将文本文件转换为 Word/PDF/Excel/图片等其它格式
  • python-leetcode 64.在排序数组中查找元素的第一个和最后一个位置
  • c语言大小端判断