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!
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
@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 đề. –
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