每个网站中都有用户头像的上传功能,刚刚再刷后springboot项目有些心得分享一下,如某站上的电脑商城的项目为例,先给出它的数据库
其中avatar字段名就是用户存储在服务器端的图片的地址,这个表在上传用户头像时要更改的字段名是修改时间(modified_time),修改者(modified_user)和avatar,用户通过seesion存储登陆用户的uid,再通过存储在session中的uid进行对用户查询,再进行上传头像功能
<!-- 上传头像所用到的mapper映射-->
<update id="updateAvatar">
UPDATE t_user SET avatar=#{avatar},modified_user=#{modifiedUser},modified_time=#{modifiedTime} WHERE uid=#{uid}
</update>
个人觉得用mapper映射文件可以更熟练的掌握其中的原理,以及更好的掌握SQL语句
/**
* 上传用户头像
* @param user 用户数据,uid,avatar,modified_user,modified_user
* @return 受影响的行数(通过受影响的行数来判断插入数据是否成功。
*/
Integer updateAvatar(User user);
UserService接口,在控制层对user对象进行封装,再将封装好的User对象传入到UserService中,封装User对象应该在Service层进行封装,我觉得传入的参数有点多可能会弄混,所以就在控制层进行封装了
User uploadAvatar(User user);
UserService实现类,在Service类中通过调用自动导入的Mapper对象,对数据库进行操作,返回的是受影响的行数,返回一就是成功了,是其他的就是失败了
@Override
public User uploadAvatar(User user) {
log.info(user.toString());
Integer row=userMapper.updateAvatar(user);
if(row !=1){
throw new updateException("上传用户头像出现未知异常");
}
return user;
}
//设置上传文件的最大大小
public static final int MAX_SIZE=10*1024*1024;
//设置文件的类型
public static final List<String> AVATAR_TYPE=new ArrayList<>();
static {
AVATAR_TYPE.add("image/png");
AVATAR_TYPE.add("image/gif");
AVATAR_TYPE.add("image/bmp");
AVATAR_TYPE.add("image/jpg");
}
@PostMapping("/change_avatar")
public JsonResult<String> uploadAvatar(HttpSession session, MultipartFile file){
//MultipartFile是spring提供的类,可以接收所有的文件的类
Integer uid = getUidFromSession(session);
User byUid = userMapper.findByUid(uid);
if(byUid.getIsDelete().equals(1)&&byUid==null){
throw new userNameNotExistsException("用户不存在");
}
if(file.isEmpty()){
throw new FileEmptyException("请选择文件");
}
if (file.getSize() >MAX_SIZE){//file.getSize()获取接收文件的大小
throw new FileSizeException("文件大小超出最大限制");
}
if(!AVATAR_TYPE.contains(file.getContentType())){//自定义接收文件的类型
throw new FileTypeException("文件类型不匹配");
}
String uploadPath = session.getServletContext().getRealPath("upload");//获取上传文件的路径(获取项目中名为‘upload’的文件夹)
log.info(uploadPath);
File dir=new File(uploadPath);//指向名为‘upload’文件夹
if(!dir.exists()){
dir.mkdirs();//若不存在,则创建该文件夹
}
String originalFilename = file.getOriginalFilename();//获取文件的真实文件名
int index = originalFilename.lastIndexOf(".");//获取文件的后缀名‘.’的位置
String substring = originalFilename.substring(index);//返回文件类型名 例如:.jpg
String filename = UUID.randomUUID().toString().toUpperCase()+substring;//新创建的文件名
File dest=new File(dir,filename);//创建一个空的文件
try {
file.transferTo(dest);
} catch (IOException e) {
throw new FileUploadIOException("文件存储出现异常");
}catch (FileStateException e){
throw new FileStateException("文件被打开,请关闭后再上传");
}
String RealFilePath="/upload/"+filename;
Date date=new Date();
User user=new User();
user.setUid(uid);
user.setModifiedTime(date);
user.setModifiedUser(byUid.getUsername());
user.setAvatar(RealFilePath);
userService.uploadAvatar(user);
return new JsonResult<String>(OK,RealFilePath);//返回图片存储在服务器的地址
}
以上就是上传头像的所有代码展示啦,如果有什么错误请留言指示我会改正(我是刚入Java的小白)