2015-06-30 3 views
0

Я хотел бы отправить несколько больших файлов по HTTP с помощью multipart/formdata.Как переместить несколько больших файлов в jetty

Я просто хочу передать их через мое обслуживание, поэтому я хотел бы получить разные части как потоки и абсолютно хотел бы избежать того, чтобы весь запрос буферизировался в памяти, прежде чем я получу возможность передать данные на.

У меня такое ощущение, что с причалом (мы используем Dropwizard 0.7.1, который поставляется с причалом 9.0.7) весь запрос буферизуется до того, как будет выполнен мой код.

Есть ли способ избежать этого? В идеале, я хотел бы иметь систему на основе событий (которая запускает событие типа «следующая часть с именем xxx» и дает мне поток, который я могу использовать).

ответ

1

Запрос с multipart/formdata обрабатывается различными внутренними компонентами, чтобы разделить секции так, чтобы HttpServletRequest.getParts() (и различные аналогичные методы) мог работать должным образом.

Вариант № 1: Ручка Multi-часть себя

Это может быть немного сложнее, чтобы разрушить это поведение сервлета спецификации, но я дам ему идти.

Во-первых, do не объявить конфигурацию @MultipartConfig для сервлета, с которым вы хотите обрабатывать данные запроса.

Далее, do не методы доступа в HttpServletRequest, которые должны знать о параметрах запроса или его частях.

Переопределите метод HttpServlet.service(HttpServletRequest, HttpServletResponse), а не метод doPost(), и обработайте необработанное содержимое полезной нагрузки запроса.

Это означает, что вы будете писать парсер MultiStart InputStream и обрабатывать парсинг мультичасти. Есть много примеров этого онлайн, вы просто захотите выбрать тот, который имеет больше смысла для вас.

Вариант № 2: Не использовать POST с мультидеталью

Если вы потоковая загрузкой файла, не используйте POST с несколькими частями, использовать PUT с исходными данными полезной нагрузки, то вы «Пропустите весь слой магии, который представляет собой полезную нагрузку POST запроса с несколькими частями.

+0

Я уже боялся этого. Большое спасибо! – Bernhard

+0

вы могли бы попробовать потоковое воспроизведение файлов через websockets. Если файлы действительно велики, в любом случае вам понадобится логика повтора/продолжения. –

Смежные вопросы