2013-08-14 5 views
5

Ich versuche, eine jquery ajax Post mit einem Input-Typ-Datei und einem normalen Eingabe-Typ mit Text und Abrufen von ihnen von meinem Servlet mit request.getParameter("element_name") aber obwohl bei der Verwendung von Chrome Inspector sehe ich das Das Objekt von FormData, das ich sende, enthält meine Datei und meinen Textwert, der servlet liest den Parameter als null aus irgendeinem Grund.Posting FormData Objekt mit Eingabearten und Datei NullPointerException

Dies ist die Form ich habe: (ticket_id kehrt erfolgreich von einem anderen jsp)

<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> 

Dies ist die jquery ajax Post Anruf:

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

Und das ist, was Ich mache in meinem doPost Methode in meinem Servlet:

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

Diese Zeile gibt eine NullPointerException zurück, obwohl die Daten gesendet werden, wie im Abschnitt "Netzwerk" in Chrome zu sehen ist.

Bitte beachten Sie, dass ich kein Problem habe, die Datei hochzuladen, ohne den Text vom Eingabetyp zu senden. Wenn ich das gleiche Formular ohne das Element tick-id-upload habe und denselben Aufruf jquery ajax verwende, wird die Datei erfolgreich hochgeladen.

Irgendwelche Ideen, was passiert? Danke vielmals!

Antwort

3

Sie können die Anforderungswerte multipart/form nicht direkt mit request.getParameter() lesen. Stattdessen müssen Sie verschiedene Teile der Multitpart-Anforderung mit der Methode getPart lesen. Hier ist, wie Sie über Ihre Anfrage mehrteiliger Teile laufen kann:

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

Folgen Sie dieser Blog für ein ausführliches Beispiel: http://balusc.blogspot.in/2009/12/uploading-files-in-servlet-30.html

+0

oh wusste nicht, dass vielen Dank für Ihre Antwort! Der Blog ist sehr detailliert, ich kann es einfach verfolgen. Nochmals vielen Dank :) – Bernice

+0

@Bernice Keine probs :-) Wenn Sie meine Antwort nützlich finden, dann akzeptieren Sie es bitte. Die Annahme der Antwort hilft anderen, die das gleiche Problem haben. –

+0

Bitte beachten Sie, dass abgesehen von dieser Lösung kann man FileItem-Klasse in Java verwenden, analysieren Sie die Anfrage und erhalten Sie die Datei oder Elemente :) Ich weiß nicht, ob ich dies als eine andere Antwort für andere Benutzer setzen sollte – Bernice