springboot上传头像

控制层

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);

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值