控制层
1. 规划异常
- FileUploadException 泛指文件上传异常(父类)继承RuntimeException
- FileEmptyException 文件为空
- FileSizeException 文件大小异常
- FileTypeException 文件类型异常
- FileUploadIOException 文件读写异常
- FileStateException 上传文件状态异常
2. 处理异常
在BaseController中进行统一编写处理
else if (e instanceof FileUploadException) {
result.setState(6000);
result.setMessage("文件上传异常");
}
else if (e instanceof FileSizeException) {
result.setState(6001);
result.setMessage("文件大小异常");
}
else if (e instanceof FileStateExceptioin) {
result.setState(6002);
result.setMessage("文件状态异常");
}
else if (e instanceof FileTypeException) {
result.setState(6003);
result.setMessage("文件类型异常");
}
else if (e instanceof FileEmptyException) {
result.setState(6004);
result.setMessage("文件为空异常");
}
else if (e instanceof FileUploadIOException) {
result.setState(6005);
result.setMessage("文件读写异常");
}
在异常统一处理列表上增加参数
@ExceptionHandler({ServiceException.class, FileUploadException.class})
3. 设计请求
/users/change_avatar
POST (get请求提交数据2kb)
HttpSession session, MutipartFile file
JsonResult< String >
4. 实现请求
// 设置上传文件的最大值
public static final int AVATAR_MAX_SIZE = 10*1024*1024;
// 限制上传文件的类型
public static final List<String> AVATAR_TYPE = new ArrayList<>();
static {
AVATAR_TYPE.add("images/jpeg");
AVATAR_TYPE.add("images/png");
AVATAR_TYPE.add("images/bmp");
AVATAR_TYPE.add("images/gif");
}
@RequestMapping("change_avatar")
public JsonResult<String> changeAvatar(HttpSession session,
// 路径变量 解决前后端不一致
@RequestParam("file") MultipartFile file) throws IOException {
// 文件是否为空
if (file.isEmpty()) {
throw new FileEmptyException("文件为空");
}
if (file.getSize() > AVATAR_MAX_SIZE) {
throw new FileSizeException("文件大小超出限制");
}
// 文件类型是否符合
String contentType = file.getContentType();
// 如果集合包含某元素则返回ture
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);
// 截取文件后缀
String suffix = "";
int index = originalFilename.lastIndexOf(".");
suffix = originalFilename.substring(index);
// 随机生成前缀名并拼接
String filename = UUID.randomUUID().toString().toUpperCase() + suffix;
File dest = new File(dir, filename); // 是一个空文件
// 参数file中数据写入到这个空文件中
try {
file.transferTo(dest); //将file文件中的数据写入到dest文件中
}
catch (FileStateExceptioin e) {
throw new FileStateExceptioin("文件状态异常");
}
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);
}