【问题标题】:Apache commons fileupload FileItemIterator hasNext() returns falseApache commons 文件上传 FileItemIterator hasNext() 返回 false
【发布时间】:2010-07-06 09:09:25
【问题描述】:

我正在使用 apache commons 文件上传流 api。但是 FileItemIterator FileItemIterator iter = upload.getItemIterator(request); 在其 hasNext() 中返回 false iter.hasNext() 这有什么问题?

代码和web部分如下:

  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>

最好的,

【问题讨论】:

    标签: java servlets file-upload apache-commons


    【解决方案1】:

    在我的 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>
    

    当我删除过滤器时,问题就解决了......

    【讨论】:

    • 换句话说,在您的 servlet 有机会解析它之前过滤已处理的请求。
    • 确实,请求体只能解析一次。您基本上是在混合两种不同的文件上传 API。第二个只会得到一个空流。您基本上需要通过第一个抓取上传的文件(或者像刚才那样禁用第一个)。
    【解决方案2】:

    一些可能值得检查的事情:

    • doPost()方法和表格中提到的servlet“AServlet”的方法一样吗?这主要是为了确保请求尚未被读取,在这种情况下,将不会将请求解析为 FileItem 对象。请求一旦解析,Commons FileUpload 无法再次解析;通常情况下,上游存在 servlet 和过滤器是造成这种情况的原因。
    • 表单提交真的有效吗?不同的文件是否会再次出现问题?理想情况下,Commons Fileupload 组件在达到文件结束条件时将不再返回任何项目,即没有更多数据要读取(已从正文中读取 content-length 标头中的字节数)。李>

    PS:最好使用 Logger 类来“双重确定”是否正在完成表单和文件字段解析。

    【讨论】:

    • - 请求仅在此 doPost 方法中解析 - 我调试了代码,当我提交表单时,我看到该方法被调用。也许一个有用的观察是请求的内容长度为 0。这可能是什么原因造成的?还是这与这个问题有关?
    • 啊哈!您是从 MSIE 6/7 提交的吗?显然,其中一个浏览器向服务器发送多个请求以进行多部分 POST。我想你可以忽略内容长度为零的那个。
    猜你喜欢
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2010-11-11
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多