1. 持久层

1. mapper接口
//根据uid修改用户头像Integer updateAvatarByUid(Integer uid, String modifiedUser, Date modifiedTime);
2. sql映射语句
  <update id="updateAvatarByUid">UPDATE t_user SET avatar = #{avatar}, modified_user = #{modifiedUser}, modified_time = #{modifiedTime} WHERE uid = #{uid}</update>
3. 测试
    @Testpublic void updateAvatarByUid() {userMapper.updateAvatarByUid(10, "/images/avatar/问号.png", "administrator", new Date());}

运行后查看数据库表:

2. 业务层

1. 规划异常
  1. 用户数据不存在
  2. 更新头像时出现未知的异常
2. 编写service接口
 /***修改用户的头像* @param uid 用户id* @param avatar 用户头像* @param modifiedBy 修改者*/void changeAvatar(Integer uid,String avatar, String modifiedBy);
3. 编写service实现类方法
@Overridepublic void changeAvatar(Integer uid, String avatar, String modifiedBy) {User result = userMapper.findByUid(uid);if(result == null) {throw new UserNotFoundException();}Integer rows = userMapper.updateAvatarByUid(uid, avatar, modifiedBy, new Date());if(rows != 1) {throw new UpdateException("修改用户头像时时产生了异常");}}
4. 测试
    @Testpublic void changeAvatar() {userService.changeAvatar(10, "/images/testAvatar.png", "luck");String avatar = userService.getByUid(10).getAvatar();System.out.println(avatar);}

结果:

3. 控制层

1. 异常处理

所有异常都处理为FileUploadException

2. 处理请求
//限制文件类型public static final ArrayList<String> AVATAR_TYPE = new ArrayList<>();static {AVATAR_TYPE.add("image/jpeg");AVATAR_TYPE.add("image/png");AVATAR_TYPE.add("image/bmp");AVATAR_TYPE.add("image/gif");}/**** @param session* @param file* @return*/@RequestMapping("/change_avatar")public JsonResult<String> changeAvatar(HttpSession session,@RequestParam("file") MultipartFile file) {if(file.isEmpty()) {throw new FileUploadException("文件为空");}String contentType = file.getContentType();if(!AVATAR_TYPE.contains(contentType)) {throw new FileUploadException("文件类型不支持");}//String realPath = session.getServletContext().getRealPath("/upload");File dir = new File(realPath);if(!dir.exists()) {dir.mkdirs();//创建当前目录}
//        获取文件名称String originalFilename = file.getOriginalFilename();//获取文件名后缀String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//        使用UUID随机生成一个新的文件名称前缀,拼接文件名称String filename = UUID.randomUUID().toString().toUpperCase() + suffix;//在指定位置创建一个空文件File destFile = new File(dir, filename);try {file.transferTo(destFile);//将file文件中的数据写入到destFile中} catch (IOException e) {throw new FileUploadException("文件读写异常");}//返回头像路径/upload/test.pngString avatar = "/upload/" + filename;userService.changeAvatar(getUidFromSession(session),avatar,getUsernameFromSession(session));return new JsonResult<>(OK, avatar);}

另外在配置文件中指定文件大小:
默认为1MB

spring.servlet.multipart.max-file-size=2MB

4. 前端

发送请求部分:

<script type="text/javascript">$(document).ready(function () {console.log("cookie中的avatar=" + $.cookie("avatar"));$("#img-avatar").attr("src", $.cookie("avatar"));});$("#btn-change-avatar").click(function() {$.ajax({url: "/users/change_avatar",type: "POST",data: new FormData($("#form-change-avatar")[0]),dataType: "JSON",processData: false, // processData处理数据contentType: false, // contentType发送数据的格式success: function(json) {if (json.state == 200) {$("#img-avatar").attr("src", json.data);$.cookie("avatar", json.data, {expires: 7});} else {alert("修改失败!" + json.message);}},error: function(xhr) {alert("您的登录信息已经过期,请重新登录!HTTP响应码:" + xhr.status);location.href = "login.html";}});});</script>

5. 测试

选择文件上传:

springboot入门项目-上传头像相关推荐

  1. springboot项目上传头像回显

    springboot项目使用ajax上传头像回显 先上效果图: 开始上传 点击提交 环境: springboot2.2.5.RELEASE jdk:1.8 thymeleaf:3.0.4.RELEAS ...

  2. springboot+vue实现上传头像文件到阿里云对象存储oss

    在阿里云oss上创建一个bucket,获取四个信息: 编写工具类,提供对外调用四个信息的方法: //当项目一启动,就执行接口的方法,读取配置文件内容 @Component public class C ...

  3. spring boot项目-上传头像

    1.mapper接口文件 Integer updateAvatarByUid(@Param("uid") Integer uid,//用户ID@Param("avatar ...

  4. springboot怎么写上传头像接口?

    最近项目中员工遇到一个问题,我把思路这里写了一下,方便以后参考: 问题描述:我想写一个关于个人头像上传的接口,在springboot里面写,我如何去写,思路是什么? 思路:1. 头像上传肯定等价于ja ...

  5. Springboot + elementUI实现上传用户头像

    最近一直在做一个背单词的小项目练手,准备着加入个新功能,想了很多种办法,本来准备利用sm.ms图床,把用户头像上传到图床然后返回链接把链接存到数据库里,后来想了想,感觉用户的头像存在那不太好,于是还是 ...

  6. SpringBoot 使用MultipartFile上传组件实现本地上传用户头像

    GIF动图展示 SpringBoot 使用MultipartFile上传组件实现本地上传用户头像GIF效果图 本章目录 GIF动图展示 主要实现思路 1.使用MultipartFile需要引入的依赖 ...

  7. SpringBoot 项目上传文件异常【java.io.IOException: Stream closed】

    项目场景: 提示:这里简述项目相关背景: 项目场景:SpringBoot 项目上传文件接口异常 21 十二月 2022 13:30:53,132 36991 [http-nio-9220-exec-3 ...

  8. 在项目中使用 Discuz!NT的上传头像功能

    大概半年前,由于某个网站项目需要整合Discuz!NT,就粗略的用了一下.觉得里面的会员上传头像功能方便好用,而且支持摄像头,就把它的代码分离出来,以后用在需要的地方. 用过Discuz!NT的朋友会 ...

  9. springboot入门系列教程|第九篇:springboot实现图片上传与显示(附源码)

    前言## 上一篇我们介绍了springboot如何实现自定义拦截器配合注解使用,那么这篇我们将介绍springboot实现图片上传的功能. 目录## 文章目录 前言## 目录## 项目创建### 项目 ...

最新文章

  1. 新的mysql如何使用_如何使用新的MySQL更新日志
  2. 河南经济管理学校2001级计算机,懂得取舍,习得自主——访管信2001级经英奖学金得主张瑞娟...
  3. python处理多个excel文件-Python将多个excel文件合并为一个文件
  4. JAVA——基于HttpClient的全国大学英语四、六级考试(CET4CET6)[2019年下半年]查询DEMO
  5. 思科路由器全局、接口、协议调试(下)
  6. redis源码剖析(八)—— 当你启动Redis的时候,Redis做了什么
  7. java阅读题_java 练习题
  8. 使用python读取kafka实时topic数据demo,包括安装kafka module
  9. python语言的变量特点随时_【Python】Python语言特点
  10. C#之网络字节序与主机字节序互转
  11. 一道不知道哪里来的容斥题
  12. Android自定义控件之自定义倒计时按钮
  13. Linux虚拟文件系统之文件系统安装(sys_mount())
  14. 计算机自带的命令提示符,Windows 10上有十种打开命令提示符的方法,你知道多少...
  15. 我的单片机固件被人给破解了
  16. item_half - 淘宝每日半价接口
  17. LeetCode 水壶问题
  18. dds文件怎么在linux查看,Linux 环境编译 OpenDDS 全记录
  19. 笔记本Ubuntu系统,关上盖子不休眠设置
  20. juc并发编程学习(一)

热门文章

  1. killall命令详解
  2. 深度剖析 Apache EventMesh 云原生分布式事件驱动架构
  3. 微博短链接解析ShortUrl
  4. 亲自测试雅迪Z3s:高端电动车的智能新味道!
  5. C# 高仿腾讯QQ (窗口皮肤美化)(附测试源码)
  6. python 输出元素索引(一维数组、字符串、二维数组)
  7. 三星手机android 6.0,还需等待 三星手机Android 6.0更新进展
  8. [收藏夹整理]电子类链接
  9. python每天定时爬取微博热搜并保存到本地(表格、数据库)
  10. 计算机一级网络设置网关步骤,internet网关如何设置 internet网关设置步骤【图文】...