Итератор Spring ServletFileUpload возвращает пустой список

Я разработал систему с микросервисной архитектурой с фреймворком spring boot (1.5.9), я использовал zuul и ленту в шаблоне шлюза. Чтобы загружать большие файлы, я отключил многокомпонентную загрузку, как показано ниже:

application.yml
spring:
  http:
    multipart:
      enabled: false
      max-request-size: -1
      max-file-size: -1

Насколько я знаю, из-за того, что spring не позволяет обрабатывать составной запрос, мы должны отключить преобразователь составных запросов Spring.
На следующем шаге я увеличил время ожидания ленты и время ожидания zuul:

gateway.yml
ribbon: #LoadBalancer
  ReadTimeout: 20000
  ConnectTimeout: 20000
zuul: #Gatway Proxy
  ignoredServices: '*'
  set-content-length: true
  #prefix: /api
  host:
    connect-timeout-millis: 20000
    socket-timeout-millis: 20000

Код загрузчика выглядит следующим образом:

DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
factory.setSizeThreshold(0);
factory.setFileCleaningTracker(null);

//Create a new file upload handler
ServletFileUpload uploader = new ServletFileUpload(new DiskFileItemFactory());

//Parse the request
FileItemIterator iter = uploader.getItemIterator(httpServletRequest);
while (iter.hasNext())
 {
 ...
 }

Я использую приведенный ниже URL для загрузки файлов:

example.com/zuul/serviceName/upload

Как объяснялось в документе spring, нам нужно добавить префикс zuul к URL-адресу, чтобы обойти фильтр zuul, и я это сделал.
Но это работает только для небольших файлов. Когда я пытаюсь загрузить большие файлы, FileItemIterator пусто iterator.

Я все протестировал и по прошествии 2 дней не смог решить проблему!


person Ali    schedule 20.05.2019    source источник
comment
У вас есть следующий заголовок Transfer-Encoding: chunked? Если да, попробуйте удалить и посмотреть, работает ли это.   -  person Sid    schedule 15.07.2019


Ответы (1)


Из официальной документации -

Загрузка файлов через Zuul

Если вы используете @EnableZuulProxy, вы можете использовать прокси-пути для загрузки файлов, и это должно работать, если файлы небольшие. Для больших файлов существует альтернативный путь, который обходит Spring DispatcherServlet (чтобы избежать многокомпонентной обработки) в «/zuul/*». Другими словами, если у вас есть zuul.routes.customers=/customers/**, вы можете отправлять большие файлы в /zuul/customers/*. Путь сервлета выводится через zuul.servletPath. Если прокси-маршрут проходит через балансировщик нагрузки ленты, для очень больших файлов также требуются повышенные настройки тайм-аута, как показано в следующем примере:

application.yml

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000
ribbon:
ConnectTimeout: 3000
ReadTimeout: 60000

Обратите внимание, что для работы потоковой передачи с большими файлами в запросе необходимо использовать фрагментированное кодирование (чего некоторые браузеры не делают по умолчанию), как показано в следующем примере:

$ curl -v -H "Transfer-Encoding: chunked" \
-F "[email protected]" localhost:9999/zuul/simple/file

Для загрузки больших файлов (10M и более) необходимо добавить префикс /zuul к пути загрузки. Вы также можете использовать zuul.servlet-path для настройки префикса.

Предположим, zuul.routes.microservice-file-upload=/microservice-file-upload/**

Вы можете попробовать обойти Spring DispatcherServlet и использовать Zuul в соответствии с вашими намерениями. Если http://{host}:{port}/upload – это путь для загрузки вашего файла, вы можете использовать Zuul's http://yourhost:port/zuul/your-service/upload путь для загрузки больших файлов.

Кроме того, вы можете попробовать игнорировать следующий заголовок «Transfer-Encoding: chunked» и посмотреть, поможет ли это.

person Sid    schedule 15.07.2019