Неожиданное чтение EOF в сокете во время загрузки файла с помощью Spring Boot 2.0 - PullRequest
0 голосов
/ 13 июня 2018

Я работаю над веб-приложением, которое использует 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 ...
}

}

Как я вижу из журналов, запрос даже не вызывает конечную точку сервера и завершается ошибкой при отправке данных со стороны пользовательского интерфейса.Похоже, какая-то проблема в сети?

Другая странная вещь заключается в том, что такого рода ошибки происходят как случайные.Просто для ~ 2-4% запросов пользователей.Даже если пользователь, у которого возникли проблемы с загрузкой, попытается загрузить еще несколько раз, часто после этого все работает нормально

Спасибо за любые ответы!

1 Ответ

0 голосов
/ 29 августа 2018

Я испытываю ту же проблему с Spring Boot 1.5.14.RELEASE.

Мне удалось воспроизвести проблему с помощью настраиваемого режима регулирования (20 КБ / с) в Chrome.Когда я загружаю большое изображение (8 МБ), я получаю тайм-аут через 30 секунд.

Обратите внимание, что я делаю загрузку через ajax, используя Dropbox.

Я немного исследовал и увидел, что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;
  }

}

Это не сработало, но я уверен, что это проблема.Я видел других людей, которые настроили тайм-аут Connector таким образом, и он работал для них ...

Я до сих пор не представляю, почему в моем случае значение по умолчанию все еще используется.Попробуйте и скажите мне, как все прошло, пожалуйста.

Обновление

Я разобрался, что происходит.Оказывается, что у Dropzone был тайм-аут.

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

Я установил на это значение, которое хотел, и все работало нормально.

Spring boot устанавливал значениеимущества:

spring.mvc.async.request-timeout= # Amount of time before asynchronous request handling times out.

отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...