2013-08-14 19 views
5

Tôi đang cố gắng làm một bài đăng jquery ajax với tệp kiểu đầu vào và kiểu nhập bình thường với văn bản và truy xuất chúng từ servlet của tôi với request.getParameter("element_name") tuy nhiên khi sử dụng trình kiểm tra Chrome đối tượng của FormData mà tôi đang gửi chứa tệp của tôi và giá trị văn bản của tôi, số servlet đang đọc tham số là null vì một số lý do.Đăng đối tượng FormData với các kiểu đầu vào và tệp NullPointerException

Đây là dạng tôi có: (TICKET_ID đang trở lại thành công từ jsp khác)

<form id="upload-form" action="upload" enctype="multipart/form-data" method="post"> 
    <input id="attach-btn" type="file" name="uploadedFile" style="display:none"/> 
    <input id="tick-id-upload" type="hidden" name="ID" value="<%=ticket_id%>" />    
    <input id="submit-form" type="button" style="display:none"/> 
</form> 

Đây là jquery ajax bài gọi:

// use to refresh section on submit of a form 
$(document).on('click', '#submit-form', function() 
{ 
    var form_data = null; 

    if (drop === false) 
    { 
     // form data object with ticket id and file 
     form_data = new FormData($('#upload-form')[0]); 
    } 
    else 
    { 
     // append dropped file and value of id seperately 
     form_data = new FormData(); 
      form_data.append('ID', $('#tick-id-upload').val()); 
     form_data.append('uploadedFile', dropped_files); 
    } 

    $.ajax(
    { 
     url: $('#upload-form').attr('action'), 
     type: 'POST', 
     async: true, 
     xhr: function() // custom XMLHttpRequest 
     { 
      myXhr = $.ajaxSettings.xhr(); 

      if (myXhr.upload) 
      { // check if upload property exists 
       myXhr.upload.addEventListener('progress', show_progress, false); // for handling the progress of the upload 
      } 
      return myXhr; 
     }, 
     dataType: 'html', // the data type to be returned 
     success: function(response, status, xhr) 
     { 
      $('#progressbar').hide(); 

      if (xhr.getResponseHeader('duplicate') === 'true') 
      { 
       // file is duplicate.. display dialog box 
      setTimeout(function() 
      { 
        $('#trigger-dialog').trigger('click'); 
      }, 10);  
      } 
      else 
      { 
       // replace attachments section by section in response 
        $('#attachments').html($(response).find('#attachments').html()); 
        execute_attach_datatable(); 
        switch_to_view(); 

        init_progress_bar(); 
        override_section_height(); 
       } 
      }, 
      error: function(xhr, status, error) 
      { 
       alert(xhr.responseText); 
      }, 
      data: form_data , // what data to pass 
      cache: false, 
      contentType: false, // type of data to be sent 
      processData: false 
     }); 
    }); 

Và đây là những gì Tôi làm theo phương thức doPost trong servlet của tôi:

int ticket_id = Integer.parseInt(request.getParameter("ID")); 

Dòng này đang trả lại NullPointerException mặc dù dữ liệu đang được gửi như được thấy từ phần Mạng trong Chrome.

Xin lưu ý rằng tôi không gặp vấn đề khi tải tệp lên mà không gửi văn bản kiểu nhập. tức là khi tôi có cùng biểu mẫu không có phần tử tick-id-upload và sử dụng cùng một cuộc gọi jquery ajax, tệp được tải lên thành công.

Bất kỳ ý tưởng nào về những gì đang xảy ra? Cảm ơn nhiều!

Trả lời

3

Bạn không thể đọc trực tiếp các tham số yêu cầu multipart/form trực tiếp bằng cách sử dụng request.getParameter(). Thay vào đó, bạn cần phải đọc các phần khác nhau của yêu cầu mulitpart bằng cách sử dụng phương thức getPart. Đây là cách bạn có thể duyệt qua các phần yêu cầu nhiều phần dữ liệu của bạn:

for (Part part : request.getParts()) { 
} 

Làm theo blog này cho một ví dụ cụ thể: http://balusc.blogspot.in/2009/12/uploading-files-in-servlet-30.html

+0

oh không biết rằng nhờ cho câu trả lời của bạn! Blog thực sự chi tiết tôi có thể dễ dàng theo dõi nó. Cảm ơn một lần nữa :) – Bernice

+0

@Bernice Không có probs :-) Nếu bạn tìm thấy câu trả lời của tôi hữu ích thì hãy chấp nhận nó. Việc chấp nhận câu trả lời sẽ giúp người khác đối mặt với cùng một vấn đề. –

+0

Xin lưu ý rằng ngoài giải pháp này, người ta có thể sử dụng lớp FileItem trong Java, phân tích cú pháp yêu cầu và nhận cả tệp hoặc mục :) Tôi không biết liệu tôi có nên đặt câu trả lời này cho một người dùng khác hay không – Bernice

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