Поврежденные данные формы: преждевременное окончание - PullRequest
0 голосов
/ 27 октября 2008

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

"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)

Ответы [ 5 ]

0 голосов
/ 19 апреля 2019

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

0 голосов
/ 28 августа 2009

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

0 голосов
/ 27 октября 2008

@ Владимир:

Я использовал http sniffer для проверки почтового запроса, и он отправляет весь файл, и формат почтового запроса правильный. Я пробовал много разных файлов (.jpg, .mp3 и т. Д.) Размером <2 МБ, и ни один из них не работает. </p>

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

Есть еще идеи?

0 голосов
/ 23 декабря 2008

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

0 голосов
/ 27 октября 2008

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

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

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

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

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

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

...