SpringBoot实现图片上传(个人头像的修改)

SpringBoot+layui实现个人信息头像的更改

该文章适合对SpringBoot,Thymeleaf,layui入门的小伙伴
废话不多说,直接上干货

Springboot+layui实现头像更换

前端公共部分代码

HTML页面代码

 	 <div class="layui-card-header" style="height: 215px"><div id="div-avatar"><a th:href="${'../'+session.account.getAvatar()}" target="_blank"><img id="img" th:src="${'../'+session.account.getAvatar()}" alt="暂无图片"></a></div><button style="display: block; margin: 12px auto;"class="layui-btn layui-bg-green layui-btn-xs avatar" lay-on="avatarBtn"><i class="fa fa-camera-retro"></i> 更换头像</button></div>

在这里插入图片描述

js部分代码(点击更换头像按钮弹出上传图片的弹窗,点击保存按钮实现图片的更新操作)

<script th:src="@{../dist/notify/notify.js}"></script>
<script>layui.use(['form', 'miniTab','notify'], function () {var form = layui.form,layer = layui.layer,miniTab = layui.miniTab;var util = layui.util;var notify=layui.notify;/** lay-on实现关闭按钮,及头像修改界面* */util.on('lay-on', {/** 点击avatarBtn弹出头像修改界面* */"avatarBtn": function () {layer.open({type: 2 //此处以iframe举例, title: '修改头像', area: ['490px', '460px'], shade: 0, maxmin: true, offset: 'auto' //为了演示,这里设置不固定], content: '/page/upload', btn: ['保存', '关闭'] //只是为了演示, yes: function () {notify.loading("正在验证头像图片合法性,请稍后","vcenter","shadow",false)setTimeout(function () {notify.destroyAll();//关闭loading$.ajax({type: 'PUT',url: "/auth/updateAvatar",//实现头像success: function (d) { // 返回的RequestResult的json对象if (d.code === 0) {//弹出成功提示框,notify.success(d.msg,"vcenter","shadow",false);}else if (d.code === 1){//如果信息一致,弹出提示框notify.warning(d.msg, "vcenter","shadow",false);}else {notify.error(d.msg,"vcenter","shadow",false);}},}).done(function () {setTimeout(function () {notify.destroyAll(); //全部关闭setTimeout(function () {miniTab.deleteCurrentByIframe();}, 1000);}, 2500);});}, 3000);return false;}, btn2: function () {layer.closeAll();}});}});});
</script>
<!--第三方插件介绍使用1、notify.info("提示消息");2、notify.warning("警告消息");3、notify.success("成功消息");4、notify.loading("加载中");5、notify.error("失败消息");6、notify.info("不显示关闭按钮", false);7、notify.warning("提示消息", function () {alert("回调成功");});8、notify.destroyAll(); //全部关闭9、notify.success("指定位置显示", "topLeft"); //参数:topLeft、topCenter、topRight、bottomLeft、bottomCenter、bottomRight、vcenter10、notify.alert("模态框", "vcenter","shadow"); //参数:shadow 显示遮罩11、notify.confirm("确认框", "vcenter","shadow"function(){alert("回调方法")}); //参数:shadow 显示遮罩 、function 确定后回调方法
-->

在这里插入图片描述

上传图片的upload.html文件

<!DOCTYPE html>
<html class="x-admin-sm" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>头像上传</title><link rel="shortcut icon" href="../resources/favicon.ico" th:href="@{/static/favicon.ico}"/><link rel="stylesheet" th:href="@{../layui/css/layui.css}"><link rel="stylesheet" th:href="@{../css/public.css}" media="all">
</head>
<body>
<div class="layuimini-container"><div class="layuimini-main"><div class="layui-upload-drag" style="display: block;" id="upload-avatar"><i class="layui-icon layui-icon-upload"></i><div>点击上传,或将文件拖拽到此处</div><div class="layui-upload-list"><hr> <img class="layui-upload-img" id="upload-preview" style="max-height: 260px;max-width: 260px"><p id="avatarText"></p></div></div></div>
</div>
<script th:src="@{../layui/layui.js}" charset="utf-8"></script>
<script th:src="@{../js/jquery-3.7.1.min.js}"></script>
<script type="text/javascript">layui.use(function(){var upload = layui.upload;var $ = layui.$;// 渲染var uploadInst = upload.render({elem: '#upload-avatar'//只要是上传图片 都用这一个接口,url: "/auth/uploadImage",before: function(obj){//预读本地文件示例,不支持ie8obj.preview(function(index, file, result){$('#upload-preview').attr('src', result); //图片链接(base64)console.log(result)});},done: function(res){//如果上传失败if(res.code >0){return layer.msg('上传失败');}//上传成功else{layer.msg('上传成功');console.log(res.data.src)}},error: function(){//演示失败状态,并实现重传var avatarText = $('#avatarText');avatarText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');avatarText.find('.demo-reload').on('click', function(){uploadInst.upload();});}});});
</script></body>
</html>

在这里插入图片描述

图片上传点击js中的保存按钮实现图片的更新保存( 公共后端代码)

controller

 /** 更新头像* updateAvatar* */@PutMapping("/updateAvatar")public ResultUtil updateAvatar() {// 获取当前登录人的信息ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();// 获取请求HttpServletRequest request = attributes.getRequest();// 获取当前登录人的信息UserEntity userEntity = (UserEntity) request.getSession().getAttribute("account");// 获取头像String avatar = (String) request.getSession().getAttribute("filename");// 打印测试System.out.println("头像:"+avatar);if (userEntity != null) {if (avatar != null){// 设置头像String avatarPath= "images/avatar/"+avatar;userEntity.setAvatar(avatarPath);// 更新头像userService.accountInformation(userEntity);// 返回成功信息return ResultUtil.ok(0, "头像修改成功");}return ResultUtil.warning(1,"头像不能为空哦!");}// 返回失败信息return ResultUtil.error("头像修改失败");}

方法一(上传图片在项目中)

loginController代码

 /** 个人头像图片上传* 方法一对应WebConfigurer 中的方法一* */@PostMapping("/uploadImage")public Map<String, Object> image(@RequestParam(value = "file") MultipartFile file,HttpSession session){Map<String, Object> map2 = new HashMap<String, Object>();Map<String, Object> map = new HashMap<String, Object>();String filename = "";//存放上传的图片在项目中的路径String localPath = System.getProperty("user.dir") + "/src/main/resources/static/images/avatar/";try {if (file != null) {//生成uuid作为文件名称String uuid = UUID.randomUUID().toString().replaceAll("-", "");//获得文件类型(可以判断如果不是图片,禁止上传)String contentType = file.getContentType();//获得文件后缀名String suffixName = contentType.substring(contentType.indexOf("/") + 1);//得到 文件名(随机数+uuid+后缀)filename = (int)((Math.random())*100000000) + uuid + "." + suffixName;//将生成的图片名称保存到session中session.setAttribute("filename", filename);//复制到项目中的文件夹Path path = Paths.get(localPath + filename);session.setAttribute("path", path);System.out.println("图片上传路径:"+path);Files.write(path, file.getBytes());}} catch (Exception e) {map.put("code", 1);map.put("msg", "");map.put("data", map2);map2.put("src", filename);return map;}map.put("code", 0);map.put("msg", "");map.put("data", map2);map2.put("src", filename);return map;}

WebConfigurer 拦截器中的方法将静态资源释放否则项目上传以后无法进行访问会出现404

   /** 方法一:配置图片的虚拟路径* */@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {//这里配置图片的虚拟路径 注意数据库存放的图片是 images/avatar/***.jpg 这种格式"file:E:/IDEAWork/ERP_Project/src/main/resources/static/images/avatar/"registry.addResourceHandler("/images/avatar/**").addResourceLocations("file:E:/IDEAWork/ERP_Project/src/main/resources/static/images/avatar/");}

方法二(单独新建文件夹来存放照片)

controller代码

 @RequestMapping(value = "/uploadImage", method = {RequestMethod.POST})public Map<String, Object> upload(MultipartFile file,HttpServletRequest request ,HttpSession session){String filename=file.getOriginalFilename();String uuid = UUID.randomUUID()+"";//这里填上传到本地的路径File dest = new File(new File("D:\\erp_img").getAbsolutePath()+ "/" + uuid+"-"+filename);if (!dest.getParentFile().exists()) {dest.getParentFile().mkdirs();}try {file.transferTo(dest);String path="images/avatar/"+uuid+"-"+filename;session.setAttribute("path",path);System.out.println(path);Map<String,Object> map2=new HashMap<>();Map<String,Object> map=new HashMap<>();map.put("code",0);map.put("msg","");map.put("data",map2);map2.put("src",path);return map;} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}Map<String,Object> map=new HashMap<>();map.put("code",1);map.put("msg","");return map;}

WebConfigurer

 @Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {//这里配置图片的虚拟路径 注意数据库存放的图片是 images/avatar/***.jpg 这种格式registry.addResourceHandler("/images/avatar/**").addResourceLocations("file:D:/erp_img/");}

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

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

相关文章

远程桌面的端口配置与优化

在现代企业环境中&#xff0c;远程桌面连接已成为日常工作中不可或缺的一部分。然而&#xff0c;随着网络攻击的增加&#xff0c;确保远程桌面连接的安全性变得尤为重要。其中一个关键的安全因素是端口配置。 一、远程桌面默认端口 远程桌面协议&#xff08;RDP&#xff09;默…

【可视化3D卷积计算过程】

目录 1. 可视化过程2. 代码验证 前言&#xff1a;开始处理视频数据&#xff0c;遇到了陌生又熟悉的3D卷积&#xff0c;但对其计算过程有点疑惑&#xff0c;网上也没找到什么可视化动画&#xff0c;所以研究明白并做个记录&#xff0c;方便日后复习。有点简化&#xff0c;但认真…

uni-app - 使用地图功能打包安卓apk的完美流程以及重要的注意事项(带您一次打包成功)

在移动应用开发中&#xff0c;地图功能是一个非常常见且实用的功能&#xff0c;可以帮助用户快速定位并浏览周边信息。而在uni-app开发中&#xff0c;使用地图功能也是一项必备技能。本文将介绍uni-app使用地图功能打包安卓apk的注意事项&#xff0c;帮助开发者顺利完成地图功能…

Linux中ssh登录协议

目录 一.ssh基础 1.ssh协议介绍 2.ssh协议的优点 3.ssh文件位置 二.ssh原理 1.公钥传输原理&#xff08;首次连接&#xff09; 2.ssh加密通讯原理 &#xff08;1&#xff09;对称加密 &#xff08;2&#xff09;非对称加密 3.远程登录 三.服务端的配置 常用的配置项…

QT程序通过GPIB-USB-HS转接线控制数字万用表

1、硬件准备 1.1、数字万用表 型号 &#xff1a;Agilent 34401A 前面图示&#xff1a; 后面图示&#xff1a;有GPIB接口 1.2、GPIB-USB-HS转接线 2、GPIB协议基础了解 2.1、引脚 8条数据线&#xff1a;DIO1 ~ DIO8 5条管理线&#xff1a;IFC、ATN、REN、EOI、SRQ 3条交握线…

“星光不问赶路人,时光不负有心人”

五一假期来临之际&#xff0c;开放签电子签章团队祝大家劳动节快乐&#xff01;愿这个五一小长假带给你轻松愉悦的心情&#xff0c;工作之余享受生活的美好。愿你的每一分努力都有回报&#xff0c;每一个梦想都逐渐实现。休息是为了走更长远的路&#xff0c;愿你假期归来&#…

时序分解 | Matlab实现RLMD鲁棒性局部均值分解

时序分解 | Matlab实现RLMD鲁棒性局部均值分解 目录 时序分解 | Matlab实现RLMD鲁棒性局部均值分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现RLMD鲁棒性局部均值分解,可直接替换 Matlab语言 1.算法新颖小众&#xff0c;用的人很少&#xff0c;包含分解图…

第11章 SELECT语句和关系代数运算

一、投影与SELECT语句 投射下标&#xff0c;是SELECT查询的列名 二、选择与SELECT语句 下标是 where后限制的条件 三、笛卡尔积与SELECT语句 合并两个关系 四、θ连接与SELECT语句 在笛卡尔积的基础上做选择运算。 五、自然连接与SELECT语句 自然连接结果中包含的列&#x…

最全类型免费SSL证书获取教程

使用SSL证书可以有效地防止数据泄露、身份伪造等网络安全问题。许多初创公司或个人开发者在面对高昂的SSL证书费用时可能会感到头疼。确实&#xff0c;一些知名的SSL证书提供商的证书价格并不低廉&#xff0c;这对于预算有限的小企业和个人来说&#xff0c;无疑构成了一定的经济…

长沙银行2023:深耕县域、扎实零售,双引擎激活增长“向新力”

&#xff08;题图&#xff09; 作者 | 曾响铃 文 | 响铃说 年报披露接近尾声&#xff0c;作为“百业之母”&#xff0c;银行业的“成绩单”自然备受关注。 整体来看&#xff0c;2023年国内经济复苏&#xff0c;企业经营状况持续改善&#xff0c;利好银行资产质量和盈利前景…

基于随机森林和Xgboost对肥胖风险的多类别预测

基于随机森林和Xgboost对肥胖风险的多类别预测 作者&#xff1a;i阿极 作者简介&#xff1a;数据分析领域优质创作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏…

基于SpringBoot+Vue大学生兼职管理系统的设计与实现

目录 一、前言介绍 二、功能需求 三、功能结构设计 四、管理员功能实现 招聘单位管理 用户管理 论坛管理 公告信息管理 五、招聘单位功能实现 职位招聘管理 职位留言管理 简历投递管理 六、用户功能实现 在线论坛 职位招聘信息 简历投递 简历 七、部分核心代码 …