8

gwtWebアプリケーションで。ファイルとそれに添付されたパラメータを送信する必要があります。

サーバーサイドで

try {

        ServletFileUpload upload = new ServletFileUpload();

        FileItemIterator iterator = upload.getItemIterator(request);

        while (iterator.hasNext()) {
            FileItemStream item = iterator.next();


            if (item.isFormField()) {

                String fieldName=item.getFieldName();
                String fieldValue = Streams.asString(item.openStream());
                System.out.println(" chk  " +fieldName +"  =  "+ fieldValue);
            } else {
                stream = item.openStream();
                fileName = item.getName();
                mimetype = item.getContentType();
                int c;
                while ((c = stream.read()) != -1) { 
                  System.out.print((char) c); 
                    }
            }
        }
    }catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
    System.out.println("out of try");
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    int nRead;
    while ((nRead = stream.read(buffer, 0, buffer.length)) != -1) {
        System.out.println("lenth111" +nRead);
        output.write(buffer, 0, nRead);
    }
    System.out.println("lenth" +nRead);
    output.flush();

このコードで私はストリームを読むことができます。また、コンソールには「試してみません」も印刷されます

そして最後にwhile ((nRead = stream.read(buffer, 0, buffer.length)) != -1) オンラインで警告が表示されました

警告:/ UploadFileServlet:org.apache.commons.fileupload.FileItemStream$ItemSkippedException。

この問題を解決する方法。??

4

1 に答える 1

9

少し遅れて答えますが、私は同じ問題を抱えていました。

その例外が発生する理由:ItemSkippedExceptionのJavaDocsは少し説明しています:

この例外は、FileItemStreamを作成したイテレータでIterator.hasNext()が呼び出された後、FileItemStream.openStream()によって返されたInputStreamからデータを読み取ろうとした場合にスローされます。

whileループの外側でInputStreamストリームを使用しているため、読み込もうとしているファイルInputStreamを閉じる(スキップする)別の反復が呼び出されるため、問題が発生します。

解決策:whileループ内でInputStreamを使用します。ファイルを処理する前にすべてのフォームフィールドが必要な場合は、クライアント側で正しい順序で設定されていることを確認してください。最初にすべてのフィールド、最後にファイル。たとえば、JavaScriptFormDataを使用します。

var fd = new window.FormData();

fd.append("param1", param1);
fd.append("param2", param2);

// file must be last parameter to append
fd.append("file", file);

そしてサーバー側:

FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
    FileItemStream item = iter.next();
    InputStream stream = item.openStream();

    // the order of items is given by client, first form-fields, last file stream
    if (item.isFormField()) {
        String name = item.getFieldName();
        String value = Streams.asString(stream);
        // here we get the param1 and param2
    } else {
        String filename = item.getName();
        String mimetype = item.getContentType();

        ByteArrayOutputStream output = new ByteArrayOutputStream();
        int nRead;
        while ((nRead = stream.read(buffer, 0, buffer.length)) != -1) {
            System.out.println("lenth111" +nRead);
            output.write(buffer, 0, nRead);
        }
        System.out.println("lenth" +nRead);
        output.flush(); 
    }
}
于 2015-09-09T10:01:50.307 に答える