Я пытаюсь загрузить файлы с помощью класса 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)




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. Это то, что приводило к сбою загрузки небольших файлов.
Как ты это починил?
Если вы не используете структуры, это можно решить, удалив библиотеки структур из библиотеки вашего проекта.
Если вы нашли ответ на свой вопрос, вам следует опубликовать ответ в качестве ответа и принять его, а не менять заголовок.