Поврежденные данные формы: преждевременное окончание

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

«java.io.IOException: поврежденные данные формы: преждевременное завершение»

На сервере я использую пакет 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)

person Matt MacLean    schedule 27.10.2008    source источник
comment
Если вы нашли ответ на свой вопрос, вы должны опубликовать ответ как ответ и принять его, а не менять заголовок.   -  person SingleNegationElimination    schedule 16.06.2009


Ответы (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.

П.П.С. Файлы имеют одинаковую структуру? Может ли быть так, что меньшие имеют другие данные (например, специальные символы), которые ломают библиотеку Flash? Например, попробуйте загружать только небольшие файлы пробелов.

person Vladimir Dyuzhev    schedule 27.10.2008

@Владимир:

Я использовал 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-формой и получил те же результаты.

Любые другие идеи?

person Matt MacLean    schedule 27.10.2008

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

person Community    schedule 23.12.2008

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

person Matt MacLean    schedule 28.08.2009
comment
Как ты это починил? - person user2930137; 18.07.2017

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

person diaaa    schedule 19.04.2019