2

私は apache commons fileupload stream api を使用しています。しかし、FileItemIteratorFileItemIterator 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>

一番、

4

2 に答える 2

2

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

フィルターを外すと問題が解決...

于 2010-07-06T11:21:14.367 に答える
0

チェックする価値があるかもしれないいくつかのこと:

  • doPost() メソッドは、フォームで参照されているサーブレット「AServlet」と同じですか? これは主に、リクエストがまだ読み取られていないことを確認するためのものです。その場合、リクエストの FileItem オブジェクトへの解析は行われません。一度解析されたリクエストは、Commons FileUpload によって再度解析することはできません。通常、上流のサーブレットとフィルタの存在がこの状態の原因です。
  • フォーム送信は実際に機能していますか? また、問題は別のファイルで再発しますか? 理想的には、Commons Fileupload コンポーネントは、End Of File 条件に達したときに、それ以上アイテムを返さないことです。つまり、読み取るデータがこれ以上ありません (コンテンツ長ヘッダーのバイト数が本文から読み取られました)。

PS: Logger クラスを使用して、フォームおよびファイル フィールドの解析が行われているかどうかを「二重に確認」する方がよい場合があります。

于 2010-07-06T10:37:48.953 に答える