2012-08-30 55 views
5

trong ứng dụng web gwt. Tôi phải gửi một tập tin và một số tham số gắn liền với nó.

trên 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(); 

với mã này tôi có thể đọc dòng. và cũng trên console "ra khỏi thử" cũng được in

Và cuối cùng trên while ((nRead = stream.read(buffer, 0, buffer.length)) != -1) dòng tôi đã nhận một cảnh báo

CẢNH BÁO:/UploadFileServlet: org.apache.commons.fileupload.FileItemStream $ ItemSkippedException.

Cách giải quyết vấn đề này. ??

+0

Hi GameBuilder và Thomas Broyer, Bạn đã tìm thấy một giải pháp về điều đó? Bởi vì tôi đã nhận được cùng một vấn đề trong nhiều ngày. Xin vui lòng, bất cứ ai có thể giúp chúng tôi? Cảm ơn bạn – Aerox

+0

hey, iam cũng đang tìm kiếm tương tự. Bạn có nhận được giải pháp nào không? –

Trả lời

4

Trả lời một chút trễ nhưng tôi có cùng một vấn đề.

Tại sao bạn nhận được rằng ngoại lệ: Các JavaDocs của ItemSkippedException giải thích một chút:

ngoại lệ này được ném ra, nếu một nỗ lực được thực hiện để đọc dữ liệu từ InputStream, đã được trả về bởi FileItemStream.openStream (), sau khi Iterator.hasNext() đã được gọi trên trình lặp, tạo ra FileItemStream.

Bạn đang sử dụng luồng InputStream ngoài vòng lặp while gây ra sự cố vì một lần lặp khác được gọi là đóng (bỏ qua) tệp InputStream mà bạn cố gắng đọc.

Giải pháp: Sử dụng InputStream bên trong vòng lặp while. Nếu bạn cần tất cả các trường mẫu trước khi xử lý tệp, hãy đảm bảo bạn đặt nó theo đúng thứ tự trên phía máy khách. Đầu tiên tất cả các lĩnh vực, cuối cùng tập tin. Ví dụ sử dụng FormData JavaScript:

var fd = new window.FormData(); 

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

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

Và trên phía máy chủ:

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

Đúng, tôi ước có thể mang nó ra ngoài vòng lặp lặp. –

Các vấn đề liên quan