今天团队里的一个小伙子在写代码的时候,遇到一个问题。他在做上传文件的表单时,限制最大上传文件的大小。但当用户上传的文件超过大小后,虽然后台有报异常,前台却没有错误提示。他拿着这个问题问到了我,我把解决问题的过程记录下来,做个分享。

总体思路

服务端拦截异常,并直接返回值给前台。前台根据返回的值给用户做下一步处理。

主要代码

  1. Spring Boot 配置文件

    server.port=8888
    # 下面两个参数是设置上传文件大小
    multipart.maxFileSize=2MB
    multipart.maxRequestSize=2MB
    # 下面两个参数是禁用spring的默认异常映射,比如将异常会自动映射到 /error下。
    spring.mvc.throw-exception-if-no-handler-found=true
    spring.resources.add-mappings=false
  2. 捕获文件超过设置大小的异常,并直接返回错误信息

    @RestControllerAdvice
    public class RestExceptionHandler {
    @ExceptionHandler(value = { MultipartException.class })
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String unknownException(Exception ex, WebRequest req) {
    System.out.println(ex);
    return "too large.";
    }
    }
  3. 前端ajax处理

    $("#upload").click(function () {
    $.ajax({
    url: '/upload',
    type: 'POST',
    cache: false,
    data: new FormData($('#uploadForm')[0]),
    processData: false,
    contentType: false}).done(function(res) {
    console.log("done");
    }).fail(function(res) {
    console.log("fail");
    console.log(res['responseText']);
    });
    })

    异常会在fail回调函数里被console.log打印出来。

END