首页 > 解决方案 > Tomcat 文件加载

问题描述

我有一个在 Apache Tomcat 上运行的 Java Web 应用程序。应用程序上传文件。文件大小应小于 10Mb,扩展名应为例如“jpg”。

  @PostMapping(value = "/register", 
               consumes = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE})
  public ResponseEntity<User> register(
             @RequestPart(value = "file", required = false) MultipartFile uploadFile, 
             @RequestPart(value = "registrationData") UserRegistrationData registrationData
  ) {
    //If extension is wrong, the method throws WronExtensionException()
    methodToValidateFileExtension(uploadFile);
  }

如果不支持扩展名,我应该得到 WronExtensionException 而不检查文件大小。但我收到错误:

UT000020: Connection terminated as request was larger than 10485760

追踪:

ERROR io.undertow.request - UT005023: Exception handling request to /mycompany/auth/api/v1/register
[m java.lang.IllegalStateException: io.undertow.server.RequestTooBigException: UT000020: Connection terminated as request was larger than 10485760
at io.undertow.servlet.spec.HttpServletRequestImpl.parseFormData(HttpServletRequestImpl.java:794) ~[undertow-servlet-1.4.25.Final.jar!/:1.4.25.Final]
at io.undertow.servlet.spec.HttpServletRequestImpl.getParameter(HttpServletRequestImpl.java:665) ~[undertow-servlet-1.4.25.Final.jar!/:1.4.25.Final]
at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:194) ~[javax.servlet-api-3.1.0.jar!/:3.1.0]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:75) ~[spring-web-4.3.17.RELEASE.jar!/:4.3.17.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.17.RELEASE.jar!/:4.3.17.RELEASE]
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61) ~[undertow-servlet-1.4.25.Final.jar!/:1.4.25.Final]
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131) ~[undertow-servlet-1.4.25.Final.jar!/:1.4.25.Final]
at org.zalando.logbook.servlet.SecurityStrategy.doFilter(SecurityStrategy.java:32) ~[logbook-servlet-1.8.1.jar!/:?]
at org.zalando.logbook.servlet.LogbookFilter.doFilter(LogbookFilter.java:39) ~[logbook-servlet-1.8.1.jar!/:?]
at org.zalando.logbook.servlet.HttpFilter.doFilter(HttpFilter.java:31) ~[logbook-servlet-1.8.1.jar!/:?]
....
Caused by: io.undertow.server.RequestTooBigException: UT000020: Connection terminated as request was larger than 10485760
at io.undertow.conduits.FixedLengthStreamSourceConduit.checkMaxSize(FixedLengthStreamSourceConduit.java:168) ~[undertow-core-1.4.25.Final.jar!/:1.4.25.Final]
at io.undertow.conduits.FixedLengthStreamSourceConduit.read(FixedLengthStreamSourceConduit.java:229) ~[undertow-core-1.4.25.Final.jar!/:1.4.25.Final]
at org.xnio.conduits.ConduitStreamSourceChannel.read(ConduitStreamSourceChannel.java:127) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at io.undertow.channels.DetachableStreamSourceChannel.read(DetachableStreamSourceChannel.java:209) ~[undertow-core-1.4.25.Final.jar!/:1.4.25.Final]
at io.undertow.server.HttpServerExchange$ReadDispatchChannel.read(HttpServerExchange.java:2332) ~[undertow-core-1.4.25.Final.jar!/:1.4.25.Final]
at org.xnio.channels.Channels.readBlocking(Channels.java:294) ~[xnio-api-3.3.8.Final.jar!/:3.3.8.Final]
at io.undertow.servlet.spec.ServletInputStreamImpl.readIntoBuffer(ServletInputStreamImpl.java:192) ~[undertow-servlet-1.4.25.Final.jar!/:1.4.25.Final]
at io.undertow.servlet.spec.ServletInputStreamImpl.read(ServletInputStreamImpl.java:168) ~[undertow-servlet-1.4.25.Final.jar!/:1.4.25.Final]
at io.undertow.server.handlers.form.MultiPartParserDefinition$MultiPartUploadHandler.parseBlocking(MultiPartParserDefinition.java:213) ~[undertow-core-1.4.25.Final.jar!/:1.4.25.Final]
at io.undertow.servlet.spec.HttpServletRequestImpl.parseFormData(HttpServletRequestImpl.java:792) ~[undertow-servlet-1.4.25.Final.jar!/:1.4.25.Final]
... 47 more

更多细节 - 我不知道文件大小属性是在哪里定义的。

所以,我的问题是:

  1. 在methodToValidateFileExtension()启动时是否已经加载了文件?
  2. 我可以在加载文件之前获取文件的扩展名吗?

标签: javaspringresttomcatfile-upload

解决方案


推荐阅读