Apache commons fileupload FileItemIterator hasNext

2019-02-19 11:16发布

问题:

I'm using the apache commons fileupload stream api. But the FileItemIterator FileItemIterator iter = upload.getItemIterator(request); returns false in its hasNext() iter.hasNext() What is wrong with this?

The code and the web part is as follows:

  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 page is as follows:

 <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,

回答1:

In my web.xml file. There was a filter

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

When i remove the filter the problem is solved...



回答2:

A few things that might be worth checking for:

  • Is the doPost() method the same as that of the servlet "AServlet" referred to in the form? This is primarily to ensure that the request has not already been read, in which case parsing of the request into FileItem objects will not happen. A request once parsed, cannot be parsed again by Commons FileUpload; usually the presence of servlets and filters upstream is responsible for this condition.
  • Is the form submit actually working? And does the issue recur with different files? Ideally, the Commons Fileupload component will not return any more items when the End Of File condition has been reached, i.e. there is no more data to read (the number of bytes in content-length header has been read from the body).

PS: It might be better to use the Logger class to be 'doubly sure' on whether the Form and File field parsing is being done or not.