首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Spring Boot 2.0上传文件时,套接字上的意外EOF读取

使用Spring Boot 2.0上传文件时,套接字上的意外EOF读取
EN

Stack Overflow用户
提问于 2018-06-13 05:14:01
回答 1查看 9.6K关注 0票数 5

我正在做webapp,它在后端使用Spring Boot 2.0。对于一些用户,我看到了这样的错误:

代码语言:javascript
复制
Failed to parse multipart servlet request; nested exception is 
java.io.IOException: 
org.apache.tomcat.util.http.fileupload.FileUploadBase
$IOFileUploadException: Processing of multipart/form-data request 
failed. Unexpected EOF read on the socket]
org.springframework.web.multipart.MultipartException: Failed to parse 
multipart servlet request; nested exception is java.io.IOException: 
org.apache.tomcat.util.http.fileupload.FileUploadBase
$IOFileUploadException: Processing of multipart/form-data request 
failed. Unexpected EOF read on the socket at 
org.springframework.web.multipart.support.
StandardMultipartHttpServletRequest.
handleParseFailure(StandardMultipartHttpServletRequest.java:122) at 
org.springframework.web.multipart.support.
StandardMultipartHttpServletRequest.
parseRequest(StandardMultipartHttpServletRequest.java:113) at 
org.springframework.web.multipart.support.
StandardMultipartHttpServletRequest.<init 
(StandardMultipartHttpServletRequest.java:86) at 
org.springframework.web.multipart.support.
StandardServletMultipartResolver.
resolveMultipart(StandardServletMultipartResolver.java:93) at 
org.springframework.web.servlet.DispatcherServlet.
checkMultipart(DispatcherServlet.java:1128) at 
org.springframework.web.servlet.DispatcherServlet.
doDispatch(DispatcherServlet.java:960) at 
org.springframework.web.servlet.DispatcherServlet.
doService(DispatcherServlet.java:925)...

你能帮我理解这个问题的根源吗?我在服务器上使用这段代码,它看起来很好:

代码语言:javascript
复制
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ResponseEntity<String> upload(HttpSession session, 
MultipartHttpServletRequest request) {

MultipartFile multipartFile = request.getFiles("file");
try (InputStream inputStream = multipartFile.getInputStream()) {
    //logic ...
}

}

正如我从日志中看到的,请求甚至不调用服务器端点,并且在从UI端发送数据时失败。看起来像是网络问题?

另一件奇怪的事情是,这种错误是随机发生的。仅用于约2-4%的用户请求。即使上载有问题的用户尝试再上载几次,在那之后通常也能正常工作

谢谢你的回答!

EN

回答 1

Stack Overflow用户

发布于 2018-08-29 16:56:02

我在Spring Boot 1.5.14版本中遇到了同样的问题。

我设法在Chrome上使用自定义的节流(20KB/s)模式重现了这个问题。当我上传一张大图片(8MB)时,我在30秒后超时。

请注意,我正在使用Dropbox通过ajax进行上传。

我调查了一下,我发现Tomcat Connector有一个异步请求超时的默认值:

代码语言:javascript
复制
/**
 * Default timeout for asynchronous requests (ms).
 */
protected long asyncTimeout = 30000;

我尝试使用Spring Boot提供的属性来增加这个限制:

代码语言:javascript
复制
# SPRING MVC (WebMvcProperties)
spring.mvc.async.request-timeout= # Amount of time before asynchronous request handling times out.

不幸的是,在我的情况下,这并不起作用。因此,我尝试以编程方式配置超时:

代码语言:javascript
复制
@Configuration
public class ServerConfiguration {

  @Bean
  public EmbeddedServletContainerFactory servletContainer() {
    TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
    factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {

      @Override
      public void customize(Connector connector) {
        connector.setAsyncTimeout(60000);
        connector.getExecutorName();
      }
    });
    return factory;
  }

}

这不管用,但我很确定这就是问题所在。我见过其他人以这种方式配置连接器超时,并为他们工作……

我仍然不知道为什么在我的例子中仍然使用默认值。试试看,请告诉我进展如何。

更新

我知道是怎么回事了。原来Dropzone本身也有一个超时。

https://www.dropzonejs.com/#config-timeout

我将其设置为我想要的值,一切工作正常。

Spring boot正在设置属性的值:

代码语言:javascript
复制
spring.mvc.async.request-timeout= # Amount of time before asynchronous request handling times out.

太完美了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50825914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档