用户头像上传_头像使用

用户头像上传_头像使用上传头像上传头像-持久层SQL语句的规划将对应文件保存在操作系统上,然后在把这个文件路径给记录,因为记录路径是非常便捷和方便,将来如果要打开这个文件可以依据这个路径去找到这个文件。在数据库中需要保存这个文件的路径即可。将所有的静态资源(图片、文件、其他资源文件)方法某台电脑上,在把这台电脑作为一台单独的服务器使用。对应是一个更新用户avatar字段的sql语句。updatet_usersetavatar=?,modified_user=?,modified=?whereuid=?设

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

上传头像


上传头像-持久层

SQL语句的规划

将对应文件保存在操作系统上,然后在把这个文件路径给记录,因为记录路径是非常便捷和方便,将来如果要打开这个文件可以依据这个路径去找到这个文件。在数据库中需要保存这个文件的路径即可。将所有的静态资源(图片、文件、其他资源文件)方法某台电脑上,在把这台电脑作为一台单独的服务器使用。

对应是一个更新用户avatar字段的sql语句。

update t_user set avatar=?,modified_user=?,modified=? where uid=?

Jetbrains全家桶1年46,售后保障稳定

设计接口和抽象方法

UserMapper接口中来定义抽象方法用于修改用户的头像。

/** * @Param("SQL映射文件中#{}占位符的变量名"): 解决的问题,当SQL语句的占位符和映射的接口方法参数名不一致时, * 需要将某一个参数强行注入到某一个占位符变量上时,可以使用@Param这个注解来标注映射的关系 * 根据用户id来修改用户头像 * @param uid * @param avatar * @param modifiedUser * @param modifiedTime * @return */
    Integer uptateAvatarByUid(@Param("uid") Integer uid,
                              @Param("avatar") String avatar,
                              @Param("modifiedUser") String modifiedUser,
                              @Param("modifiedTime") Date modifiedTime);


}

接口的映射

UserMapper.xml文件中编写映射的SQL语句。

  <update id="updateAvatarByUid">
        UPDATE t_user SET
        avatar=#{avatar},
        modified_user = #{modifiedUser},
        modified_time = #{modifiedTime}
        WHERE uid = #{uid}
    </update>

在测试类编写测试方法

@Test
public void updateAvatarByUid(){ 
   
    userMapper.updateAvatarByUid(7,"/web/load.png","系统管理员",new Date());
};

上传头像-业务层

规划异常

1.用户数据不存在,找不到对应用户的数据。(无需重复开发)

2.在更新的时候,有可能会有各种未知的异常产生。(无需重复开发)

设计接口和抽象方法

/** * 修改用户的头像 * @param uid 用户的id * @param avatar 用户的头像 * @param username */
void changeAvatar(Integer uid, String avatar, String username);

实现抽象方法

编写业务层的更新用户头像的方法。

 @Override
    public void changeAvatar(Integer uid, String avatar, String username) { 
   
        //判断用户是否为空
        User result = userMapper.findByUid(uid);
        if(result==null || result.getIsDelete()==0){ 
   
            throw new UserNotFoundException("用户不存在");
        }
        Integer rows = userMapper.updateAvatarByUid(uid, avatar, username, new Date());
        if(rows != 1){ 
   
            throw new UpdateException("用户更新头像时产生了未知的异常");
        }
    }

测试业务层方法的执行。

 @Test
    public void changeAvatar(){ 
   
        userService.changeAvatar(7,"/aaa/aaa.png","系统管理员");
    }

上传头像-控制层

规划异常

图片传到控制层可能会发生的异常
文件异常的父类
FileuploadException 泛指文件上传的异常(父类)继承RuntimeException

父类是:FileuploadException
FileEmptyException 文件为空的异常
FileSizeException 文件大小超出限制
FileTypeException 文件类型异常
FileUploadIOException 文件读写的异常
五个构造方法显示的声明出来,再去继承相关的父类。

在异常统一处理方法的参数列表上增加新的异常处理作为它的参数

@ExceptionHandler({ 
   ServiceException.class,FileUploadException.class})

设计请求

/users/change_avatar
POST(get请求提交数据2kb)
HttpSession session,MutipartFile file
JsonResult

实现请求

/** * MutipartFile接口是SpringMVC提供的一个接口,这个接口为我们包装了获取文件类型的数据(任何类型的file都可以接收), * SpringBoot有整合SpringMVC,只需要在处理请求的方法参数列表声明一个参数类型为MutipartFile的参数,然后SpringBoot * 自动将传递给服务的文件数据赋值给这个参数 * * @RequestParam 表示请求中的参数,将请求中的参数注入请求处理方法的某一个参数上, * 如果名称不一致则可以使用@RequestParam注解进行标记和映射 * @param session * @param file * @return */
	@RequestMapping("update_avatar")
	public JsonResult<String> changeAvatar(HttpSession session, @RequestParam("file") MultipartFile file){ 
   
	    //判断文件是否为空
	    if(file.isEmpty()){ 
   
	        throw new FileEmptyException("文件不存在");
	    }
	    //判断文件大小
	    if(file.getSize() > AVATAR_MAX_SIZE){ 
   
	        throw new FileSizeException("文件超出限制");
	    }
	    //判断文件的类型是否是规定的后缀类型
	    String contentType = file.getContentType();
	    //如果集合包含某个元素则返回值为true
	    if(!AVATAR_TYPE.contains(contentType)){ 
   
	        throw new FileTypeException("文件类型不支持");
	    }
	    //上传的文件.../upload/文件.png
	    String parent = session.getServletContext().getRealPath("upload");
	    //File对象指向路径,可以判断file是否存在
	    File dir = new File(parent);
	    if(!dir.exists()){ 
   //检测目录是否存在
	        dir.mkdirs();//没有就创建目录
	    }
	    //获取到文件的名称,UUID工具来生成一个新的字符串作为文件名
	    //例如:avatar01.png
	    String originalFilename = file.getOriginalFilename();
	    System.out.println("originalFilename = " +originalFilename);
	    int index = originalFilename.lastIndexOf(".");
	    String suffix = originalFilename.substring(index);
	    String filename = UUID.randomUUID().toString().toUpperCase() + suffix;
	    File dest = new File(dir,filename);//空文件
	    //参数file中的数据写到空文件(dest)中
	    try { 
   
	        file.transferTo(dest);//把file文件中的数据写入到dest文件中(后缀要一致)
	    }catch(FileStateException e){ 
   
	        throw new FileStateException("文件状态异常");
	    } catch (IOException e) { 
   
	        throw new FileUploadIOException("文件读写异常");
	    }
	    Integer uid = getUidFromSession(session);
	    String username = getUsernameFromSession(session);
	    //返回的头像路径 /upload/test.png
	    String avatar = "/upload" + filename;
	    userService.changeAvatar(uid,"avatar",username);
	    //返回用户头像的路径给前端,将来用于头像的展示使用
	    return new JsonResult<>(OK,avatar);
	}

上传头像-前端页面

在upload页面编写上传头像的代码(说明:如果直接使用表单进行文件的上传,需要给表单显示的添加一个属性enctype=”multipart/form-data”声明出来,不会将目标文件的数据结构做修改在上传,不同字符串。)

解决Bug

更改默认的大小限制

SpringMVC默认为1MB文件可以进行上传,手动的去修改SpringMVC默认上传的大小。
方式1:直接可以在配置文件中进行配置:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=15MB

方式2:需要再用java代码的形式来设置文件的上传大小限制。主类中进行配置,可以定义一个方法,必须使用@Bean修饰来修饰。在类的前面添加一个@Configration注解进行修饰类。MutipartConfigElement类型。

@Configuration //表示配置类
@SpringBootApplication
// MapperScan注解指定当前项目中的Mapper接口路径的位置,在项目启动的时候会自动加载所有接口
@MapperScan("com.cy.store.mapper")
public class StoreApplication { 
   

    public static void main(String[] args) { 
   
        SpringApplication.run(StoreApplication.class, args);
    }

    @Bean
    public MultipartConfigElement getMultipartConfigElement(){ 
   
        //创建一个配置工厂类的对象
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //设置需要创建对象的相关信息
        factory.setMaxFileSize(DataSize.of(10, DataUnit.MEGABYTES));
        factory.setMaxRequestSize(DataSize.of(15,DataUnit.MEGABYTES));
        //通过工厂类来创建MultipartConfigElement对象
        return factory.createMultipartConfig();

    }

}

显示头像

在页面通过ajax请求来提交文件,提交完成后返回了json串,解析出data中的数据,设置到img头像标签的src属性就可以了。
* serialize():可以将表单数据数据自动拼接成key=value的结构进行提交给服务器,一般提交普通的控件类型中的数据(text\password\radio\checkbox) 等等
* FormData类:将表单中的数据保持原有的结构进行数据的条件。
new FormData($(“#form”)[0]);//文件类型的数据可以使用FormData对象进行存储
* ajax默认处理数据时按照字符串的形式进行处理,以及默认会采用字符串的形式进行提交数据。关闭这两个默认的功能。

processData:false, //处理数据的形式,关闭处理数据
contentType:false, //提交数据的形式,关闭默认提交数据的形式

登录后显示头像

可以在更新头像成功后,将服务器返回的头像路径保存在客户端cookie对象,然后每次检测到用户上传头像页面,在这个页面中通过ready()方法来自动检测去读取cookie中头像并设到src属性上。

1.设置cookie中的值:
导入cookie.js文件

<script src="../bootstrap3/js/jquery.cookie.js" type="text/javascript" charset="utf-8"></script>

调用cookie方法:

$.cookie(key,value,time); // 单位:天

2.在upload.html页面先引入cookie.js文件

<script src="../bootstrap3/js/jquery.cookie.js" type="text/javascript" charset="utf-8"></script>

3.在upload.html页面通过ready()自动读取cookie中的数据。

$(document).ready(function () { 
   
		let avatar = $.cookie("avatar");
		//将cookie中的值获取出来设置到头像的src属性上
		$("#img-avatar").attr("src",avatar);
	});

4.显示最新的头像
在更改完头像后,将新的头像地址,在一次保存在cookie中,同名保存会覆盖cookie中的值。

//将头像保存在cookie中
```javascript
$.cookie("avatar",json.data,{ 
   expires :7})
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210065.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm上方的运行栏隐藏了_pycharm工具栏怎么调出来

    pycharm上方的运行栏隐藏了_pycharm工具栏怎么调出来pycharm顶部菜单栏不见,两种处理方法,处女座福音方法一:踩坑搜索,全网都是这样的:双击Shift键盘,点击Actions,搜索view,找到MainMenu,打开,ok方法二:曲线救国我找了半天,发现能进设置界面,随便点一个进入设置点击快捷键,将主菜单设置一个快捷键,这里我设置的W+W设置完成,应用界面上双击WW,就出现了主菜单,再把主菜单打开,完美。。…

    2022年8月27日
    14
  • java voliate,voliate 的实现原理是什么【面试题详解】「建议收藏」

    java voliate,voliate 的实现原理是什么【面试题详解】「建议收藏」今天爱分享给大家带来voliate的实现原理是什么【面试题详解】,希望能够帮助到大家。volatile可以保证线程可见性且禁止指令重排序,但是无法保证原子性。在JVM底层volatile是采用“内存屏障”来实现的,加入volatile关键字时,汇编后会多出一个lock前缀指令。lock前缀指令其实就相当于一个内存屏障。happen-before原则保证了程序的“有序性,对volatile变量的…

    2022年6月9日
    38
  • vs生成sln文件_VS二进制文件

    vs生成sln文件_VS二进制文件VisualStudio.NET采用两种文件类型(.sln和.suo)来存储特定于解决方案的设置,它们总称为解决方案文件。为解决方案资源管理器提供显示管理文件的图形接口所需的信息,从而在每次继续开发任务时,不会因开发环境而分散精力;*.sln:(VisualStudio.Solution)通过为环境提供对项目、项目项和解决方案项在磁盘上位置的引用,可将它们组织到解决方案…

    2022年5月3日
    591
  • R语言介绍

    R语言简介R语言是一种为统计计算和图形显示而设计的语言环境,是贝尔实验室(BellLaboratories)的RickBecker、JohnChambers和AllanWilks开发的S语言

    2021年12月26日
    102
  • oracle修改sequence最大最小值_oracle取最大值的记录

    oracle修改sequence最大最小值_oracle取最大值的记录序列是oracle提供的用于生成一系列唯一数字的数据库对象,序列会自动生成顺序递增的序列号,以实现自动提供唯一的主键值,系列可以在多个用户并发环境中使用,并且可以为所有用户生成不重复的顺序数字,而不需要任何额外的I/O开销。创建序列序列和视图一样,并不占用实际的存储空间,只是在数据字典中保存他的定义信息。当创建序列时必须拥有createsequence系统权限。语法格式:createsequ…

    2022年10月18日
    2
  • POJ 3982 序列 塔尔苏斯问题解决

    POJ 3982 序列 塔尔苏斯问题解决

    2022年1月8日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号