Can I send a file as multipart by XMLHttpRequest
to a servlet? I am making a form and submitting it as multipart, but somehow I am not getting a response for successfully uploading it. I do not want the page to be refreshed, so it has to take place by ajax.
That's only possible with XHR FormData
API (previously known being part of as "XHR2" or "XHR Level 2", currently known as "XHR Advanced Features").
Given this HTML,
<input type="file" id="myFileField" name="myFile" />
you can upload it as below:
var formData = new FormData();
formData.append("myFile", document.getElementById("myFileField").files[0]);
var xhr = new XMLHttpRequest();
xhr.open("POST", "myServletUrl");
xhr.send(formData);
XHR will take care about proper headers and request body encoding and the file will in this example be available in the server side as form-data
part with the name myFile
.
You need to keep in mind that FormData
API is not supported in older browsers. At caniuse.com you can see that it's currently implemented in Chrome 7+, Firefox 3.5+, Safari 5+, IE 10+ and Opera 12+.
In case you're using jQuery, then you might be tempted to use its $.val()
function as below:
formData.append("myFile", $("#myFileField").val());
But this is incorrect as it doesn't return the whole File
object, but merely the file name as String
which is utterly useless as it doesn't contain the file contents.
If you don't want to use document.getElementById()
for some reason, then use one of the following instead:
formData.append("myFile", $("#myFileField").prop("files")[0]);
formData.append("myFile", $("#myFileField")[0].files[0]);
An alternative is to use the jQuery Form plugin. Your entire form, when written and functioning properly without any line of JavaScript code, will then instantly be ajaxified with just the following line:
$("#formId").ajaxForm(function(response) {
// Handle ajax response here.
});
It also supports file uploads as well by a hidden iframe trick. See also this jQuery Form documentation for an in depth explanation. You may only need to change the servlet code to be able to intercept on both normal (synchronous) and ajax (asynchronous) requests. See also this answer for a concrete example: Simple calculator with JSP/Servlet and Ajax
Either way, the uploaded file should then be available in the doPost()
method of a @MultipartConfig
servlet as follows:
Part myFile = request.getPart("myFile");
Or if you're still on Servlet 2.5 or older, use Apache Commons FileUpload the usual way. See also this answer for a concrete example: How to upload files to server using JSP/Servlet?