为什么这个exceptionFileItemStream $ ItemSkippedException?

在gwt Web应用程序中。 我必须发送一个文件和一些附加的参数。

在ServerSide上

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(); 

使用此代码,我可以读取流。 并且还在控制台“out of try”上也打印出来

最后在while ((nRead = stream.read(buffer, 0, buffer.length)) != -1)行我得到了一个警告

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

如何解决这个问题呢。??

回答有点迟,但我遇到了同样的问题。

为什么会出现exception:ItemSkippedException的JavaDocs解释了一下:

如果在创建FileItemStream的迭代器上调用Iterator.hasNext()之后尝试从FileIream读取数据,则会抛出此exception,这是由FileItemStream.openStream()返回的。

您正在使用while循环之外的InputStream 导致该问题,因为调用另一个迭代来关闭(跳过)您尝试读取的文件InputStream。

解决方案:在while循环中使用InputStream。 如果在处理文件之前需要所有表单字段,请确保在客户端以正确的顺序设置它。 首先是所有字段,最后是文件。 例如,使用JavaScript FormData:

 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(); } }