Swagger-ui在文件上传时报错net::ERR_CONNECTION_RESET

我会带着你远行 2021-11-16 16:01 496阅读 0赞

Swagger-ui在文件上传时报错net::ERR_CONNECTION_RESET

项目版本

spring-boot 2.1.6.RELEASE

swagger 2.7.0

在使用swagger做接口测试的时候遇到了一个诡异的问题,在文件超过限制大小的时候,没有按照全局异常拦截返回相应的错误码,而是直接抛出了一个net::ERR_CONNECTION_RESET的报错,页面没有任何返回显示

测试代码如下

controller

  1. @PostMapping
  2. @ApiOperation(value = "/upload", notes = "upload", httpMethod = "POST")
  3. public ResultVO<Void> upload(@RequestPart(name = "file") MultipartFile file) throws Exception {
  4. saveFile(FILE_SAVE_PATH, file.getOriginalFilename(), file);
  5. return ResultVO.success();
  6. }

全局异常拦截配置

  1. @Slf4j
  2. @RestControllerAdvice
  3. public class GlobalExceptionHandler {
  4. @ExceptionHandler(value = Exception.class)
  5. public ResultVO<Void> exceptionHandler(Exception e) {
  6. log.info("go to global exception handler: {}", e);
  7. return ResultVO.error(ResultStateEnum.ERROR);
  8. }
  9. }

配置文件

  1. server:
  2. port: 10001
  3. spring:
  4. application:
  5. name: spring-cloud-upload-swagger-demo
  6. servlet:
  7. multipart:
  8. max-file-size: 30MB
  9. max-request-size: 30MB

运行项目,打开swagger页面

在这里插入图片描述

上传一个小于30MB的文件,得到成功的返回

在这里插入图片描述

查看后台文件大小

  1. INFO 1016 --- [io-10001-exec-1] c.m.d.u.s.controller.DemoController : file:springcloudgateway.jpg, size:46343

再上传超过30MB的文件,则没有任何返回显示

在这里插入图片描述
查看控制台,显示报错信息
在这里插入图片描述

查看后台打印,确实进入了全局异常

  1. INFO 1016 --- [io-10001-exec-3] c.m.d.u.s.config.GlobalExceptionHandler : go to global exception handler: {}
  2. 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 (39356221) exceeds the configured maximum (31457280)
  3. at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.handleParseFailure(StandardMultipartHttpServletRequest.java:121) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  4. at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:114) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  5. at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.<init>(StandardMultipartHttpServletRequest.java:87) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  6. at org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:87) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  7. at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1176) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  8. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1011) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  9. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  10. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) [spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  11. at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908) [spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  12. at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) [tomcat-embed-core-9.0.21.jar:9.0.21]
  13. at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) [spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  14. at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) [tomcat-embed-core-9.0.21.jar:9.0.21]
  15. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-9.0.21.jar:9.0.21]
  16. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.21.jar:9.0.21]
  17. at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-embed-websocket-9.0.21.jar:9.0.21]
  18. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.21.jar:9.0.21]
  19. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.21.jar:9.0.21]
  20. at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  21. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) [spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  22. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.21.jar:9.0.21]
  23. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.21.jar:9.0.21]
  24. at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) [spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  25. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) [spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  26. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.21.jar:9.0.21]
  27. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.21.jar:9.0.21]
  28. at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) [spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  29. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) [spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  30. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.21.jar:9.0.21]
  31. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.21.jar:9.0.21]
  32. at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) [spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  33. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) [spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  34. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.21.jar:9.0.21]
  35. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.21.jar:9.0.21]
  36. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) [tomcat-embed-core-9.0.21.jar:9.0.21]
  37. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.21.jar:9.0.21]
  38. at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [tomcat-embed-core-9.0.21.jar:9.0.21]
  39. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.21.jar:9.0.21]
  40. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.21.jar:9.0.21]
  41. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.21.jar:9.0.21]
  42. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.21.jar:9.0.21]
  43. at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-embed-core-9.0.21.jar:9.0.21]
  44. at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.21.jar:9.0.21]
  45. at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853) [tomcat-embed-core-9.0.21.jar:9.0.21]
  46. at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587) [tomcat-embed-core-9.0.21.jar:9.0.21]
  47. at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.21.jar:9.0.21]
  48. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_191]
  49. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_191]
  50. at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.21.jar:9.0.21]
  51. at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]
  52. Caused by: java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (39356221) exceeds the configured maximum (31457280)
  53. at org.apache.catalina.connector.Request.parseParts(Request.java:2925) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
  54. at org.apache.catalina.connector.Request.parseParameters(Request.java:3214) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
  55. at org.apache.catalina.connector.Request.getParameter(Request.java:1116) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
  56. at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:381) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
  57. at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:84) [spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
  58. ... 23 common frames omitted
  59. Caused by: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (39356221) exceeds the configured maximum (31457280)
  60. at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:808) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
  61. at org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:256) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
  62. at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:280) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
  63. at org.apache.catalina.connector.Request.parseParts(Request.java:2881) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
  64. ... 27 common frames omitted

对比使用POSTMAN进行测试上传同一个文件,则能得到正确的全局异常定义的返回

在这里插入图片描述

找到一个临时的解决方案

将配置文件的文件大小调高

  1. server:
  2. port: 10001
  3. spring:
  4. application:
  5. name: spring-cloud-upload-swagger-demo
  6. servlet:
  7. multipart:
  8. max-file-size: 100MB
  9. max-request-size: 100MB

再添加手动的文件上传拦截器

  1. @Component
  2. public class FileUploadInterceptor implements HandlerInterceptor {
  3. private final long MAX_FILE_SIZE = 30 * 1024 * 1024;
  4. @Override
  5. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
  6. if (null != request && ServletFileUpload.isMultipartContent(request)) {
  7. long requestSize = new ServletRequestContext(request).contentLength();
  8. if (requestSize > MAX_FILE_SIZE) {
  9. throw new MaxUploadSizeExceededException(MAX_FILE_SIZE);
  10. }
  11. }
  12. return true;
  13. }
  14. }

将文件上传拦截器加入

  1. @Component
  2. public class InterceptorConfig implements WebMvcConfigurer {
  3. @Autowired
  4. private FileUploadInterceptor fileUploadInterceptor;
  5. @Override
  6. public void addInterceptors(InterceptorRegistry registry){
  7. registry.addInterceptor(fileUploadInterceptor);
  8. }
  9. }

重启项目,测试上传

在这里插入图片描述

临时方案二,发现导致连接重置的配置是max-request-size

修改配置文件,去掉拦截器

max-request-size可以设置的比较大,-1测试的情况来看也不是大小无限制

  1. server:
  2. port: 10001
  3. spring:
  4. application:
  5. name: spring-cloud-upload-swagger-demo
  6. servlet:
  7. multipart:
  8. max-file-size: 30MB
  9. max-request-size: -1

尝试切换了Jetty和Undertow两个不同的servlet容器也是会有问题

GITHUB源码参考

欢迎关注微信交流
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,496人围观)

还没有评论,来说两句吧...

相关阅读