SpringBoot+Vue+ElementUI实现头像上传

news/2024/5/10 3:33:37/文章来源:https://blog.csdn.net/weixin_46073538/article/details/127288167

SpringBoot+Vue+ElementUI实现头像上传

  • 1.基础知识(补充)
  • 2.后端依赖导入Maven
  • 3.后端Controller代码(核心)
  • 4.配置代码(核心)
  • 5.前端代码
  • 6.总结

1.基础知识(补充)

File协议:

FIle协议也叫本地文件传输协议 ,主要用于访问本地计算机中的文件,就如同在Windows资源管理器中打开文件或者通过右键单击‘打开’一样。即File协议是访问你本机的文件资源。
要使用File协议,基本的格式如下:file:///文件路径。

2.后端依赖导入Maven

这里使用到了hutool工具,很好用,不过建议新手多了解底层,在使用工具

<!-- 文件上传工具类 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency>
<!-- hutool 工具类 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.8</version></dependency>

3.后端Controller代码(核心)

看不懂代码请认真看代码上面的注释,写的比较详细了,如果有什么不懂的,或者有什么问题,可以在评论区指出,都会回答的!!!为的就是共同学习!!!

这个项目我用到的是SpringSecurity,然后通过一个BaseController封装了SecurityContextHolder来获取当前登录用户的信息,其次就是用到了一些定义好的变量

将上传的文件通过前端表单传给后端,后端通过file.transferTo()方法下载到本地

@PostMapping("/avatar")public R<Map<String,Object>> avatar(MultipartFile file) throws IOException {// 获取当前登录用户LoginUser loginUser = getLoginUser();// 文件名称  时间日期+文件名_uuid+后缀String fileName = StrUtil.format("{}/{}_{}.{}", DateUtil.format(DateUtil.date(),"yyy/MM/dd"), FilenameUtils.getBaseName(file.getOriginalFilename()),DateUtil.format(new Date(),"yyyyMMdd")+ IdUtil.fastUUID(),FilenameUtils.getExtension(file.getOriginalFilename()));// 父目录String baseDir = WenJianConfig.getAvatarPath();//路径拼接File desc = new File(baseDir + File.separator + fileName);if (!desc.exists()){if (!desc.getParentFile().exists()){desc.getParentFile().mkdirs();}}// 下载file.transferTo(desc);int dirLastIndex = WenJianConfig.getProfile().length() + 1;// 截取upload/下的名称存入数据库String currentDir = baseDir.substring(dirLastIndex);// /profile/avatar/2022/10/10/293a05e068a7dfb298c87238de858130_2022101031242e4a-079a-4d4b-9c5c-139f5d2152ab.jpeg// Constants.RESOURCE_PREFIX = "/profile";String avatar = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;// 修改数据库中的头像路径iSysUserService.updateUserAvatar(loginUser.getUser().getUsername(),avatar);Map<String, Object> map = new HashMap<>();// 将头像路径返回,这里是为了头像上传后有一个回显的效果map.put("imgUrl",avatar);// 将缓存中的对象信息进行一个更新loginUser.getUser().setAvatar(avatar);tokenUtil.setLoginUser(loginUser);return R.ok(map);}

4.配置代码(核心)

在application.yml中配置本地保存的路径,后面想改下载的路径可以直接在配置文件中修改

# 项目相关配置
wenjian:# 文件路径 示例( Windows配置D:/wenjian/uploadPath,Linux配置 /home/wenjian/uploadPath)profile: D:/wenjian/uploadPath

获取yml中配置路径的属性值

package com.sky.common.config;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;/*** @author 尹稳健~* @version 1.0* @time 2022/10/9*/
@Component
@ConfigurationProperties(prefix = "wenjian")
public class WenJianConfig {/** 上传路径 */private static String profile;public static String getProfile() {return profile;}public void setProfile(String profile) {WenJianConfig.profile = profile;}/*** 获取导入上传路径*/public static String getImportPath(){return getProfile() + "/import";}/*** 获取头像上传路径*/public static String getAvatarPath(){return getProfile() + "/avatar";}/*** 获取下载路径*/public static String getDownloadPath(){return getProfile() + "/download/";}/*** 获取上传路径*/public static String getUploadPath(){return getProfile() + "/upload";}
}

这个时候就有人会问如何进行一个头像回显?
就拿这个路径进行举例:

/profile/avatar/2022/10/10/293a05e068a7dfb298c87238de858130_2022101031242e4a-079a-4d4b-9c5c-139f5d2152ab.jpeg

凭什么网页拿着这玩意可以直接展示出来一张图片?
因为在后端这里进行一个路径映射

@Configuration
public class MyWebConfigurer implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {/** 本地文件上传路径 */// Constants.RESOURCE_PREFIX = "/profile"// WenJianConfig.getProfile() = 你本地存储的位置registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**").addResourceLocations("file:" + WenJianConfig.getProfile() + "/");}}

图片展示在网页上
在这里插入图片描述

5.前端代码

前端使用的是Vue+ElementUI,所以我只截图关键代码,谢谢!!

参数解读:

  • action:是必须指定的,这对应着你后端的接口。
  • headers:我这里为什么指定了呢?一开始我是没有指定,但是我发现如果你不指定,那么你通过点击确定按钮后,后端不会进行一个响应,因为SpringSecurity把他拦截下来了,因为你本次请求没有携带token信息,所以这里我添加了一个headers。
  • on-success:这个也是关键参数,文件上传成功时的钩子,将上传的文件流传给后端进行接收,后端再将数据进行响应回前端 。
<el-uploadclass="avatar-uploader"action="http://localhost:8080/manage/sys/user/avatar":show-file-list="false":on-success="handleAvatarSuccess":before-upload="beforeAvatarUpload":headers="headerObj"><img v-if="avatar" :src="avatar" class="img-circle img-lg" /><i v-else class="el-icon-plus avatar-uploader-icon"></i></el-upload><script>
export default {
methods: {handleAvatarSuccess(res, file) {let formData = new FormData();// 将文件传给后端下载formData.append("file", file);this.$message.success(res.msg);this.avatar = "http://localhost:8080" + res.data.imgUrl;// 将数据保存再vuex中this.$store.commit("setAvatar", this.avatar);},beforeAvatarUpload(file) {const isJPG = file.type === "image/jpeg";const isLt2M = file.size / 1024 / 1024 < 2;if (!isJPG) {this.$message.error("上传头像图片只能是 JPG 格式!");}if (!isLt2M) {this.$message.error("上传头像图片大小不能超过 2MB!");}return isJPG && isLt2M;},},
}
</script>

6.总结

  1. 文件上传不难,关键点在前端接收文件,然后将文件传给后端,后端将文件通过流的方式下载到指定的位置。
  2. 稍微难一点的地方就是图片回显,只需要将本地的路径返回给前端就行通过file:/文件路径,的方式进行一个图片的回显

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

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

相关文章

【Transform3D】转换详解(看完就会)

文章内包含个人理解&#xff0c;如有错误请指出。 往期文章 【css动画】移动的小车 【CSS3】 float浮动与position定位常见问题&#xff08;个人笔记&#xff09; 如何完成响应式布局&#xff0c;有几种方法&#xff1f;看这个就够了 详解 CSS3中最好用的布局方式——flex…

【python】准点跑路人必备小程序~ 不信你用不到

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 有时候下班~忙着跑路&#xff0c;忘记关电脑&#xff0c;逮到了会被老板扣工资&#xff01;&#xff01;怎么办&#xff1f; python带你制做一个小程序&#xff0c;到点自动关机~ 再也不怕忘关电…

APS计划排产软件在食品饮料行业的应用

近年来&#xff0c;我国饮料行业飞速发展&#xff0c;已经成长为一个庞大、成熟的市场&#xff0c;形成了原料供应—制造—流通完整的产业链条和工业体系。 据报道&#xff0c;2022年上半年&#xff0c;国内饮料行业销量同比下滑6.8%&#xff0c;销售额同比下滑5.5%。消费行业整…

CUDA程序调试的一些经验

目录 1. 存储分配检查 2. 变量名检查 3. 核函数输出检查 4. 核函数局部存储空间回收 最近在做一个点云配准的项目&#xff0c;重新把之前就开始玩的CUDA重新拾起来。本来想着稍微改改代码就能够愉快的跑起来&#xff0c;结果改Bug改的我相当上头。结合我之前的帖子和我最近的一…

使用油猴下载文库

简介 工作中经常需要下载资料&#xff0c;大多数情况下&#xff0c;我们搜索到的资料会在某度文库中&#xff0c;激动的准备存在本地方便以后观摩&#xff0c;又因为页面下方的VIP下载&#xff0c;露出尴尬的笑容。这里介绍两种方式&#xff0c;一种省钱省事&#xff0c;一种免…

matlab之Signal Labeled APP

APP工作流程 &#xff08;1&#xff09;导入数据进信号标注器 &#xff08;2&#xff09;创建或导入信号标注定义 &#xff08;3&#xff09;交互式或自动标记信号 &#xff08;4&#xff09;自定义标注视图 &#xff08;5&#xff09;仪表板 &#xff08;6&#xff09;导出标记…

“箭”指智能家居,卫浴龙头企业箭牌家居即将登陆A股

智哪儿获悉&#xff0c;2022年10月13日&#xff0c;国内卫浴龙头企业箭牌家居集团股份有限公司&#xff08;以下简称箭牌家居&#xff0c;001322.SZ&#xff09;刊登首次公开发行股份发行公告&#xff0c;计划近期在深市主板上市。据披露&#xff0c;箭牌家居本次共计发行新股9…

【Google三驾马车系列】GFS原理总结

这里写自定义目录标题GFS基本框架容错机制Master 的容错机制 &#xff1a;操作日志 Checkpoint ShadowMasterChunkServer的容错机制&#xff1a;复制多个副本 checksum一致性问题元数据的一致性Chunk的强一致性其它重要的技术点总结如何避免单一master的性能瓶颈垃圾延迟删除…

Keithley吉时利2182A/Keysight是德34420A纳伏表测量软件-纳伏表软件

1、软件概述 纳伏表程控软件用于需要更高精度的电压测量和温度测量的应用&#xff0c;操作简便、绘制测量波形图直观。 2、软件功能 ◆纳伏表程控软件可以满足GPIB、RS-232两种连接方式。 ◆纳伏表程控软件可以满足CH1、CH2两通道选择。 ◆纳伏表程控软件可以满足多量程及分辨率…

(附源码)计算机毕业设计ssm河南美丽乡村旅游信息网

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

支付模块-微信支付

目录 接口实现 第一步&#xff1a;当点击立即购买生成订单 第二步&#xff1a;根据订单id查询订单信息 第三步&#xff1a;生成微信支付的二维码 第四步&#xff1a;查询订单支付状态 前端实现 ​编辑 1.点击支付 2.订单详情页 接口实现 像这种微服务B2C模式的&#…

【牛客刷题】每日一练——最小K个数

✨hello&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f345;&#x1f345;系列专栏:【牛客刷题】 ✈️✈️本篇内容: 最小K个数&#xff01; ⛵⛵作者简介&#xff1a;一名双非本科大三在读的科班Java编程小白&#xff0c;道阻且长&#xff0c;你我同…

《漂浮城堡历险记》的云端之旅

《漂浮城堡历险记》是 The Sandbox 游戏制作基金支持的项目之一。让我们告诉你更多关于这个 The Sandbox 元宇宙独有的、令人上瘾的奇幻游戏的信息吧。它已在 The Sandbox Alpha 第 3 季中上线了&#xff01; 关于体验 在《漂浮城堡历险记》这个冒险战斗游戏中&#xff0c;玩家…

基于深度学习的机载激光扫描森林单株茎的检测、分割与模型拟合

Abstract 精确测量树木的结构特征&#xff0c;如高度、直径、宽度和锥度&#xff0c;是森林资源调查的重要组成部分。目前&#xff0c;地面和空中激光雷达都被用来产生点云数据&#xff0c;通过这些数据可以确定清单指标。陆地/地面扫描通常提供每平方米数千个点的点云分辨率&…

(附源码)计算机毕业设计ssm核酸结果查询系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【 java 多线程】同步锁 (Lock) 解决线程的安全问题

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

计算机网络课程设计——中小型网络工程设计

文件地址:https://github.com/Recursiondzl/Computer-Network 摘 要&#xff1a;本次计算机网络实践&#xff0c;完成了中小型网络工程设计与实现对计算机网络知识进行了系统的复习&#xff0c;实践能力获得了巨大的提升。 中小型网络工程设计与实现中&#xff0c;使用路由器…

DDD初步简单理解

概述 最近有一个项目要使用DDD模式来写&#xff0c;大致整理一下笔记。 问题&#xff1a;为什么要使用DDD&#xff1f;大概要怎么使用DDD&#xff1f; 目录 概述 MVC和DDD比较 实例介绍 简洁代码逻辑示例 总结 MVC和DDD比较 MVC&#xff08;module&#xff0c;view&#xff0c…

最适合跑步用的耳机有哪些、精选五款最优秀的跑步耳机推荐

越来越多的人选择在运动的时候佩戴蓝牙耳机&#xff0c;身为健身教练&#xff0c;也有很多人会让我们推荐蓝牙耳机&#xff0c;那么现在到底市面上哪些机型是最适合跑步的时候用的呢&#xff1f;我趁着最近有空搜集了一些资料跟我使用过的经验&#xff0c;给大家整理了一份最值…

揭秘EVM Opcodes

1. 引言 本文主要源自Macro团队的Gilbert在ETHNewYork 2022分享 Demystifying EVM Opcodes&#xff0c;同时结合evm.codes来理解。 学习EVM Opcodes&#xff0c;可成为更好的Solidity工程师。 更好的Solidity工程师&#xff0c;意味着&#xff1a; 1&#xff09;理解Solidity…