我正在开发webapp,它在后端使用Spring Boot 2.0。 对于一些用户,我看到了这种错误:
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)...
你能帮我理解这个问题的根源吗?我在服务器上使用此代码,看起来很好:
@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%的jof用户请求。即使上传有问题的用户尝试上传几次,通常也会在此之后正常工作
感谢您的回答!
答案 0 :(得分:1)
我在Spring Boot 1.5.14.RELEASE中遇到了同样的问题。
我设法通过在Chrome上使用自定义节流(20KB / s)模式来重现该问题。上传大图片(8MB)时,我在30秒后超时。
请注意,我正在使用Dropbox通过Ajax进行上传。
我调查了一下,发现Tomcat Connector
具有异步请求超时的默认值:
/**
* Default timeout for asynchronous requests (ms).
*/
protected long asyncTimeout = 30000;
我尝试使用Spring Boot提供的属性来增加此限制:
# SPRING MVC (WebMvcProperties)
spring.mvc.async.request-timeout= # Amount of time before asynchronous request handling times out.
不幸的是,在我看来,这没有用。因此,我尝试以编程方式配置超时:
@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正在设置属性的值:
spring.mvc.async.request-timeout= # Amount of time before asynchronous request handling times out.
完美。