Spring ServletFileUpload итератор возвращает пустой список - PullRequest
0 голосов
/ 20 мая 2019

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

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

Насколько мне известно, из-за того, что 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

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

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

1 Ответ

0 голосов
/ 15 июля 2019

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

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

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

application.yml

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

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

$ curl -v -H "Transfer-Encoding: chunked" \
-F "file=@mylarge.iso" localhost:9999/zuul/simple/file

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

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

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

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

...