2012-10-24 37 views
6

Tôi tải lên tệp mà tôi duyệt bằng input type="file" trong ứng dụng web của tôi. Vấn đề là tôi nhận được kích thước danh sách FileItem là 0 mặc dù tôi có thể thấy tất cả các thông tin tập tin được tải lên dướiTải tệp lên bằng parseRequest của ServletFileUpload?

request ->JakartaMutltiPartRequest -> file thuộc tính

Đây là mã java mà đọc file

public InputStream parseRequestStreamWithApache(HttpServletRequest request) 
    throws FileUploadException, IOException { 
    InputStream is = null; 
    FileItemFactory factory = new DiskFileItemFactory(); 
    ServletFileUpload upload = new ServletFileUpload(factory); 
    List items = upload.parseRequest(request); 
    // here the item size is 0 ,i am not sure why i am not getting my file upload in browser with type="file" 
    // but If inspect request in debugger i can see my file realted info in request--->JakartaMutltiPartRequest----->files attribute 
    Iterator iter = items.iterator(); 
    while (iter.hasNext()) { 
    FileItem item = (FileItem) iter.next(); 

    if (!item.isFormField()) { 
     is = item.getInputStream(); 
    } 
    } 

    return is; 
} 

EDIT:

đây là JSP phần:

<form NAME="form1" action="customer/customerManager!parseRequestStreamWithApache.action" ENCTYPE="multipart/form-data" method="post" > 
    <TABLE > 
     <tr> 
       <th>Upload File</th> 
        <td> 
        <input name="fileUploadAttr" id="filePath" type="file" value=""> 
       </td> 
        <td > 
       <Input type="submit" value ="uploadFile"/> 
        </td> 
      </tr> 
    </TABLE> 
</form> 
+0

đăng jsp của bạn tại đây –

+0

Mã biểu mẫu HTML của bạn là gì? –

+0

Đã đăng mã jsp/html quá –

Trả lời

11

Như tôi đã nói trong một nhận xét cho cùng một câu hỏi, bạn đã đăng trước đó, điều này rất có thể do bạn đã phân tích cú pháp yêu cầu trước đó. Các tệp này là một phần của nội dung yêu cầu và bạn chỉ có thể phân tích cú pháp một lần.

Cập nhật:

Tôi thường làm sử dụng commons-upload theo cách đó:

if (ServletFileUpload.isMultipartContent(request)) { 
    ServletFileUpload fileUpload = new ServletFileUpload(); 
    FileItemIterator items = fileUpload.getItemIterator(request); 
    // iterate items 
    while (items.hasNext()) { 
     FileItemStream item = items.next(); 
     if (!item.isFormField()) { 
      is = item.openStream(); 
     } 
    } 
} 
+0

Nhưng tôi đã không phân tích cú pháp yêu cầu trước đó –

+0

Bạn có thể hiển thị phần còn lại của mã servlet của bạn thực hiện bất kỳ điều gì với HttpServletRequest của bạn trước khi parseRequestStreamWithApache() được gọi không? –

+0

Tôi đã đặt mã trong bộ lọc web đầu tiên của mình, vẫn là kết quả tương tự. Có vẻ như đó không phải là vấn đề –

0

Làm thế nào lớn là các tập tin bạn đang tải lên? Có thể bạn đã vượt quá ngưỡng mặc định. Tôi nghĩ mặc định là 10K

factory.setSizeThreshold(maxSizeYouWantToHandle); 
+0

Ngưỡng đặt giới hạn cho kích thước dữ liệu sẽ được giữ trong bộ nhớ, nếu ngưỡng (mặc định 10K là chính xác) được chuyển, dữ liệu sẽ được lưu trữ trên đĩa. Trong java.io.tempdir theo mặc định. –

3

Bạn nên kiểm tra cho nội dung nhiều phần dữ liệu

boolean isMultipart = ServletFileUpload.isMultipartContent(request); 

if (isMultipart) { 
    FileItemFactory factory = new DiskFileItemFactory(); 
    ServletFileUpload upload = new ServletFileUpload(factory); 

    try { 
     List items = upload.parseRequest(request); 
     Iterator iterator = items.iterator(); 
     while (iterator.hasNext()) { 
      FileItem item = (FileItem) iterator.next(); 
      if (!item.isFormField()) { 
       String fileName = item.getName(); 

       String root = getServletContext().getRealPath("/"); 
       File path = new File(root + "/fileuploads"); 
       if (!path.exists()) { 
        boolean status = path.mkdirs(); 
       } 

       File uploadedFile = new File(path + "/" + fileName); 
       item.write(uploadedFile); 
      } 
     } 
    } catch (Exception e) { 
+0

isMultipart content đánh giá thành true –

+0

@MSach có vẻ như url hành động có xung đột với bộ lọc struts. Nếu bạn đang sử dụng struts tại sao bạn không sử dụng tính năng tải lên tập tin của nó? Đăng web.xml và xóa mọi thứ ngoại trừ cấu hình servlet. –

0

Nếu bạn đang sử dụng WebLogic 12 sau đó kiểm tra xem patch_wls1211 được insatlled hay không. Tôi đã gặp vấn đề tương tự và nó đã được giải quyết sau khi áp dụng patch_wls1211.

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