控制层:
//设置上传文件的最大值
public static final int AVATAR_MAX_SIZE=10*1024*1024;// 10MB Byte字节
//限制上传文件的类型
public static final List<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");
}
/**
* 文件上传要求form表单的请求方式必须为post,并且添加属性enctype="multipart/form-data"
* SpringMVC中将上传的文件封装到MultipartFile对象中,通过此对象可以获取文件相关信息
*
* MultipartFile接口是SpringMVC提供的一个接口,这个接口为我们包装了
* 获取文件类型的数据(任何类型的file都可以接收),SpringBoot它又整合了
* SpringMVC,只需要在处理请求的方法参数列表上声明一个参数类型为 MultipartFile
* 的参数,然后SpringBoot自动将传递给服务器的文件数据赋值给这个参数
*
* @RequestParam 表示请求中的参数,将请求中的的参数注入请求处理方法的某个参数上
* 如果名称不一致则可以使用@RequestParam注解进行标记和映射
* @param session
* @param file
* @return
*/
@RequestMapping("/change_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("文件大小超出限制");
}
if(!AVATAR_TYPE.contains(file.getContentType()))
{
System.out.println(file.getContentType());
throw new FileTypeException("文件不符合规定类型异常");
}
//获取服务器中upload目录的路径
String path = session.getServletContext().getRealPath("upload");
System.out.println(path);
File dir=new File(path);
if(!dir.exists())
{
dir.mkdir(); //在项目的路径下新建指定目录
}
//如:test.png
String filename = file.getOriginalFilename();//文件名
System.out.println(filename);
String suffix = filename.substring(filename.lastIndexOf("."));//获取文件后缀 .png
String uuid = UUID.randomUUID().toString();//唯一通用识别码UUID--》随机生成字符串 /解决文件名相同覆盖问题
String fileFinalName=uuid+suffix;//最后生成的文件名
System.out.println(fileFinalName);
String fileFinalPath=path + File.separator + fileFinalName;//上传的文件最后所在的目录
System.out.println(fileFinalPath);
try {
file.transferTo(new File(fileFinalPath));//file文件中数据写入到指定的文件下
} catch (IOException e) {
throw new FileUploadIOException("文件上传异常");
}catch (FileStateException e)
{
throw new FileStateException("文件状态异常");
}
Integer uid = getUidFromSession(session);
String username = getUsernameFromSession(session);
//返回路径为/upload/NAJBUN-JDIABEU-MCIBSVAUN-90NIN.png
String avatar="/upload/"+fileFinalName;//相对路径
userService.changeAvatar(uid,avatar,username);
//返回用户头像的路径给前端页面,将来用于头像展示使用
return new JsonResult<>(OK,avatar);
}