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!
oh wusste nicht, dass vielen Dank für Ihre Antwort! Der Blog ist sehr detailliert, ich kann es einfach verfolgen. Nochmals vielen Dank :) – Bernice
@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. –
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