Поврежденные данные формы: преждевременное завершение

Я пытаюсь загрузить файлы с помощью класса FileReference. Файлы размером> 2 МБ работают правильно, но файлы размером менее 2 МБ вызывают эту ошибку:

"java.io.IOException: Corrupt form data: premature ending"

На сервере я использую пакет com.oreilly.servlet для обработки запроса.

Я много раз использовал этот пакет для успешной обработки загрузки файлов из flex, но по какой-то причине теперь у меня возникла эта проблема.

Вот трассировка стека для получения дополнительной информации:

java.io.IOException: Corrupt form data: premature ending
    at com.oreilly.servlet.multipart.MultipartParser.<init>(MultipartParser.java:205)
    at com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:222)
    at com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:173)
    at com.mydomain.FileUploadServlet.doPost(FileUploadServlet.java:46)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:414)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)

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

SingleNegationElimination 16.06.2009 03:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
19 720
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

http://www.servlets.com/cos/faq.html

Почему при использовании com.oreilly.servlet.MultipartRequest или MultipartParser большие загрузки не выполняются? Сами классы были специально разработаны, чтобы не иметь ограничения на максимальный размер загрузки (в отличие от большинства других утилит для загрузки файлов), но для защиты вашего сервера конструктор позволяет вам установить максимальный размер POST для принятия. Любая загрузка, превышающая установленный предел, останавливается. Максимальное значение по умолчанию - 1 мегабайт. Для обсуждения трудностей сервера при уведомлении клиента об ошибке см. Обсуждение в Java Servlet Programming, 2nd Edition, page 119.

Итак, вы указали максимальный размер POST для приема?

P.S. Хорошо, теперь я вижу, что проблема возникает из-за небольших загрузок. По приведенной выше ссылке на часто задаваемые вопросы есть раздел, посвященный устранению неполадок при загрузке, включая некоторые полезные методы для выявления причины (клиент, браузер, веб-сервер, библиотеки). Попробовать их.

Установите плагин Firefox (Tamper Data или Firebug), который показывает запрос, отправленный на сервер. Может помочь вам понять, есть ли какие-либо различия между загрузками <2M и> 2M.

P.P.S. У файлов одинаковая структура? Может быть, у меньших есть другие данные (например, специальные символы), которые нарушают работу библиотеки Flash? Попробуйте, например, загружать небольшие файлы с пробелами.

@ Владимир:

Я использовал HTTP-сниффер, чтобы проверить почтовый запрос, и он отправляет весь файл, и формат почтового запроса правильный. Я пробовал много разных файлов (.jpg, .mp3 и т. д.) Размером <2 МБ, но ни один из них не работает.

Максимальный размер сообщения составляет 1,5 ГБ.

Вот что такое почтовый запрос:

------------cH2ae0ei4ae0cH2ae0Ef1KM7gL6GI3
Content-Disposition: form-data; name = "Filename"

IMG0001.jpg
------------cH2ae0ei4ae0cH2ae0Ef1KM7gL6GI3
Content-Disposition: form-data; name = "Filedata"; filename = "IMG0001.jpg"
Content-Type: application/octet-stream

<file data here>
------------cH2ae0ei4ae0cH2ae0Ef1KM7gL6GI3
Content-Disposition: form-data; name = "Upload"

Submit Query
------------cH2ae0ei4ae0cH2ae0Ef1KM7gL6GI3--

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

Есть другие идеи?

Причина этого в том, что запрос отправлен с заголовком «Transfer Encoding: chunked» вместо заголовка Content-length. Многие серверы не понимают фрагментированный контент, как и другие. С помощью сниффера проверьте, был ли ваш запрос отправлен с заголовком Transfer encoding. Я не знаю решения для этого.

Ответ принят как подходящий

Похоже, что существует ошибка при совместном использовании класса com.orielly.servlet.MultipartRequest и фильтра org.apache.struts2.dispatcher.ActionContextCleanUp. Это то, что приводило к сбою загрузки небольших файлов.

Как ты это починил?

user2930137 18.07.2017 17:40

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

Другие вопросы по теме