暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

生活不止眼前的代码 2019-07-29
519

网页浏览

https://blog.csdn.net/yingziisme/article/details/97621229

项目版本

spring-boot 2.1.6.RELEASE

swagger 2.7.0

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

测试代码如下

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源码参考

https://github.com/yingziisme/spring-boot-swagger-upload-demo

文章转载自生活不止眼前的代码,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论