Apache commons fileupload FileItemIterator hasNext () возвращает false - PullRequest
2 голосов
/ 06 июля 2010

Я использую apache commons fileupload stream api. Но FileItemIterator FileItemIterator iter = upload.getItemIterator(request); возвращает false в свой hasNext () iter.hasNext() Что с этим не так?

Код и веб-часть:

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {

    /**
     * Apache commons file upload method will be used
     */
    // Check that we have a file upload request
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);

    if (isMultipart) {
        try {
            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload();
            // Parse the request
            FileItemIterator iter = upload.getItemIterator(request);

            while (iter.hasNext()) {
                FileItemStream item = iter.next();
                String name = item.getFieldName();
                InputStream stream = item.openStream();
                if (item.isFormField()) {
                    System.out.println("Form field " + name + " with value " + Streams.asString(stream) + " detected.");
                } else {
                    System.out.println("File field " + name + " with file name " + item.getName() + " detected.");
                    // Process the input stream
                    //...
                }
            }

        } catch (FileUploadException ex) {
              Logger.getLogger(ResourceUploadServlet.class.getName()).log(Level.SEVERE, null, ex);

        }
    }

Страница JSP выглядит следующим образом:

 <form action="AServlet" method="POST"
              enctype="multipart/form-data">
                            <input type="file" name="Content" />
                            Description : <input  type="text" name="Description" />
                        <input type="submit" value="Submit" />

        </form>

Best

Ответы [ 2 ]

2 голосов
/ 06 июля 2010

В моем файле web.xml.Был фильтр

    <filter>
        <filter-name>resourceUploadServlet</filter-name>
        <filter-class>org.mortbay.servlet.MultiPartFilter</filter-class>
        <init-param>
            <param-name>maxSize</param-name>
            <param-value>2147483648</param-value>
        </init-param>
    </filter>

Когда я удаляю фильтр, проблема решается ...

0 голосов
/ 06 июля 2010

Несколько вещей, которые стоит проверить:

  • Является ли метод doPost () тем же, что и в сервлете "AServlet", указанном в форме?Это прежде всего для гарантии того, что запрос еще не прочитан, и в этом случае разбор запроса в объекты FileItem не произойдет.Разобранный запрос не может быть снова проанализирован Commons FileUpload;обычно наличие сервлетов и фильтров выше по потоку отвечает за это условие.
  • Работает ли форма отправки?И проблема повторяется с различными файлами?В идеале компонент Commons Fileupload не будет возвращать больше элементов, когда будет достигнуто условие «Конец файла», то есть больше нет данных для чтения (количество байтов в заголовке длины содержимого было прочитано из тела).

PS: Возможно, было бы лучше использовать класс Logger, чтобы быть «вдвойне уверенным» в том, выполняется разбор полей «Форма» и «Файл» или нет.

...