文章目录
- 背景
- 现象
- 解决方案
- 背后原因
背景
使用springboot上传大文件,项目里进行全局异常处理,上传文件超过配置文件max大小,异常被捕获,浏览器端没有任何返回值。
从后台报错日志来看,异常已经被全局异常处理捕获到了,并且也已经完成响应,而前端(swagger,browser)没有看到返回信息
应用技术栈:springboot,ControllerAdvice,swagger,fileupload
现象
- 浏览器显示
net:: ERR_CONNECTION_ABORTED
或者
!Provisional headers are shown
- swagger显示:
TypeError: Failed to fetch
- curl显示:
HTTP/1.1 100
HTTP/1.1 500
Access-Control-Allow-Methods: GET, POST, DELETE, PUT, OPTIONS
Access-Control-Allow-Credentials: true
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: X-XSS-Protection: 1; mode=block
Content-Security-Policy: default-src 'self'
Content-Type: application/json;charset=UTF-8
Content-Length: 400
Date: Mon, 26 Apr 2021 03:04:28 GMT
Connection: close
{"timestamp":1619406268972,"status":500,"error":"Internal Server Error","message":"Maximum upload size exceeded; nested exception is : : the request was rejected because its size \u002891871897\u0029 exceeds the configured maximum \u002862914560\u0029","path":"/xxserver/fileupload"}
解决方案
- 根据实际规格资源限制,配置如下参数,并在业务逻辑中进行文件大小的判断
-file-size=${size}
-request-size=${size}
-swallow-size=${size}
- 当前端有代理层资源限制(比如nginx限制上传文件大小)时,配置size=-1即可
背后原因
根本原因在于浏览器处理请求和curl/postman的处理方式有差异,浏览器在处理案例中http请求时,
- 浏览器request请求已发送,但是因为MaxUploadSizeExceededException异常导致数据没有发送完成。
- 浏览器在处理post请求过程中,如果请求没有完成(该场景中,上传文件数据没有完成),response信息会被浏览器吞没;所以在swagger-ui界面或者浏览器上没有看到response信息。
- 当使用curl或者postman做文件上传时,输出了500错误,以及全局异常拦截器handle的结果数据