2010-07-16 32 views
5

Vâng, tôi phải nói rằng cho đến nay, điều này khiến tôi bối rối. Ứng dụng web của chúng tôi đang chạy trong Tomcat 6.0.18 không hoạt động trong khi tải tệp lên nhưng chỉ khi máy khách là máy cửa sổ, chỉ dành cho một số máy và cho tất cả trình duyệt, không chỉ IE.Tải lên tệp Apache Commons - Luồng đã kết thúc bất ngờ

Có một dấu vết ngăn xếp trong nhật ký, điều này dường như chỉ ra rằng khách hàng đã đóng kết nối hoặc luồng bị hỏng bằng cách nào đó. Nguyên nhân gốc rễ trong dấu vết ngăn xếp được đưa ra như sau:

Caused by: org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly 
    at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:983) 
    at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:887) 
    at java.io.InputStream.read(InputStream.java:85) 
    at org.apache.commons.fileupload.util.Streams.copy(Streams.java:94) 
    at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64) 
    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:362) 
    ... 70 more 

Mã khiến dấu vết trông khá thẳng về phía trước.

private Map<String, Object> getMap(ActionRequest request) { 

    HashMap<String, Object> parameters = new HashMap<String, Object>(); 
    if (request == null) { 
     return parameters; 
    } 

    if (request.getContentType() == null) { 
     return parameters; 
    } 

    try { 
     if(PortletFileUpload.isMultipartContent(request)){ 
      DiskFileItemFactory factory = new DiskFileItemFactory(); 
      PortletFileUpload upload = new PortletFileUpload(factory); 
      List<DiskFileItem> fileItems = upload.parseRequest(request); 
      for(DiskFileItem fileItem : fileItems) { 
       String name = fileItem.getFieldName(); 
       //now set appropriate variable, populate hashtable 
       if(fileItem.isFormField()) { 
        String value = fileItem.getString(request.getCharacterEncoding()); 
        if(parameters.get(name) == null) { 
         String[] values = new String[1]; 
         values[0] = value; 
         parameters.put(name, values); 
        } else { 
         Object prevobj = parameters.get(name); 
         if(prevobj instanceof String[]) { 
          String[] prev = (String[]) prevobj; 
          String[] newStr = new String[prev.length + 1]; 
          System.arraycopy(
            prev, 0, newStr, 0, 
            prev.length 
          ); 
          newStr[prev.length] = value; 
          parameters.put(name, newStr); 
         } else { 
          //now what? I think this breaks the standard. 
          throw new EatMyHatException(
            "file and input field with same name?" 
          ); 
         } 
        } 
       } else { 
        // Yes, we don't return FileParameter[] for multiple files of same name. AFAIK, that's not allowed. 
        FileParameter fp = new FileParameter(fileItem); 
        parameters.put(name, fp); 
        files.add(fp); 
       } 
      } 
     } else { 
      // Not multipart 
      return toObjectMap(request.getParameterMap()); 
     } 
    } catch (FileUploadException e) { 
     throw new RuntimeException(e); 
    } catch (UnsupportedEncodingException e) { 
     throw new RuntimeException(e); 
    } 
    return parameters; 
} 

Dòng đó là cho chúng ta đau buồn là một trong những điều này:

List<DiskFileItem> fileItems = upload.parseRequest(request); 

nào vì một lý do là quyết định mà suối từ một số máy Windows là một cách nào đó bị hỏng.

Tôi nghĩ rằng tôi đã tìm thấy thứ gì đó that may be related trên StackOverflow. Dường như có một số lỗi trong Tomcat 6 đã được sửa trong phiên bản 6.0.20, một phiên bản hơi cao hơn phiên bản chúng tôi đang sử dụng. Thật không may nó không đề cập đến những gì vấn đề chính nó được. Tôi đã had a look tại danh sách thay đổi Tomcat, nhưng không thể thấy bất kỳ ứng viên nào có khả năng xảy ra lỗi có thể gây ra sự cố này.

Dù sao, về câu hỏi thực tế của tôi, có ai đó gặp phải sự cố tương tự và nếu có thì vấn đề cơ bản là gì và bạn giải quyết vấn đề đó như thế nào?

Cảm ơn bạn trước vì bất kỳ câu trả lời nào.

EDIT: Điều này dường như là một số loại vấn đề với cân bằng tải và Tomcat. Nếu bạn bỏ qua các cân bằng tải và truy cập Tomcat trực tiếp thông qua địa chỉ IP của máy chủ, vấn đề sẽ biến mất. Điều kỳ lạ là điều này xuất hiện trong cả môi trường dàn dựng của chúng tôi, trong đó chúng tôi sử dụng Apache/AJP1.3 và sống, nơi chúng tôi sử dụng Zeus.

EDIT3: Điều này hóa ra là sự cố với tường lửa của khách hàng. Dường như họ đã ... .. không hoàn toàn trung thực khi họ nói rằng chắc chắn đây không phải là vấn đề về Tường lửa.

+0

Bạn có sẵn lòng nêu chi tiết vấn đề chính xác trong câu trả lời cho câu hỏi này không? – MattC

+0

Matt, tôi xin lỗi, nhưng tôi không biết chính xác vấn đề Firewall là gì. Chúng tôi đã được liên lạc đơn giản bởi client-Firewall-fix và thông báo rằng nó đã là một vấn đề tường lửa. – Jon

Trả lời

1

Có thể bạn cần tcpdump/wireshark video tải lên xấu và phải và sau đó so sánh chúng?

+0

Có, chúng tôi đã thử điều này với Wireshark, thành thật mà nói tôi có ít kinh nghiệm diễn giải. Nó đã được thực hiện khó khăn hơn bởi thực tế là vấn đề đã được liên tục và khó khăn để tái sản xuất. Trong mọi trường hợp, nó hóa ra lại là Tường lửa. – Jon

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