当前位置:

【踩坑笔记】SpringBoot设置全局捕获MaxUploadSizeExceededException异常

机器助手 | 
 112人浏览

需求:在Spring Boot项目中对来自前端的文件上传请求做大小限制,限制文件大小在20mb以内,超出则提示“文件大于20mb”
自定义全局异常 相应代码

java全局异常拦截代码

    @ExceptionHandler({MaxUploadSizeExceededException.class})
    public DataSet maxUploadSizeExceededException(MaxUploadSizeExceededException maxUploadSizeExceededException) {
        log.info("=====================文件大于100mb====================");
        log.info(maxUploadSizeExceededException+"");
        return new DataSet.error("文件超过大于限制100mb");
    }


yml配置
 

spring:
  servlet:
    multipart:
      max-file-size: 100mb
      max-request-size: 100mb

结果报错

org.springframework.web.multipart.MaxUploadSizeExceededException:
Maximum upload size exceeded; nested exception is java.lang.IllegalStateException:
org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException:
the request was rejected because its size (10935680) exceeds the configured maximum (10485760)

百度好多资料,说是超出tomcat内置的文件大小设置异常会先于controller触发导致异常无法捕获
按照百度提供的解决方案:配置yml

spring:
  servlet:
    multipart:
      enabled: true #默认支持文件上传
      max-file-size: 100mb
      max-request-size: 100mb
      resolve-lazily: true #设置为懒加载,不然依然会捕获不到异常
    tomcat:
      max-swallow-size: 100MB #最重要的是这行

结果依然不可以,有一点奇怪的是


这里可以打印,说明可以触发异常的,都是前端响应结果


前端使用的是Vue,axios
 

this.$axios({
                    method:"post",
                    url:"/imgUpDown",
                    data:formData,
                    headers: {'Content-Type': 'multipart/form-data'}
                }).then(res => {
                    console.log("响应成功:服务端返回值为:",res)
                    
                }).catch(e=>{
                    console.log("请求失败:错误信息:",e)
                   
                })



前端就是不响应后端自定义捕获异常封装的结果
…若干个小时以后。。。

最后乱试了一下nginx的配置发现了巨坑

1)resolve-lazily: true   这个是重点不然捕获不到异常

2)proxy_http_version 1.1;

最后正确的yml配置
 

spring:
  servlet:
    multipart:
      enabled: true #默认支持文件上传
      max-file-size: 100mb
      max-request-size: 100mb
      resolve-lazily: true #设置为懒加载,不然依然会捕获不到异常

正确的nginx的配置

location / {
         proxy_pass http://xxxx:9090/;
         proxy_http_version 1.1;
         proxy_read_timeout 6000s;
         proxy_pass_header Server;
         proxy_set_header X-Scheme $scheme;
         proxy_redirect off;

         # 真实的客户端IP
         proxy_set_header   X-Real-IP   $remote_addr;
         # 请求头中Host信息
         #proxy_set_header   Host    $host;
         # 代理路由信息,此处取IP有安全隐患
         proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
         # 真实的用户访问协议
         proxy_set_header   X-Forwarded-Proto $scheme;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "Upgrade";
         add_header  Cache-Control  max-age=no-cache;
   }

坑爹

nginx之前没加这行proxy_http_version 1.1;   后来加上这行就成功了,奥尼骂,巨坑记录一下

成功

 

该文章部分内容已隐藏

文章评论