XMLHttpRequest – представляет собой JavaScript-объект, который может использоваться для асинхронного обмена данными с сервером.
 
Программный интерфейс XMLHttpRequest Level 2 добавляет поддержку для программного интерфейса FormData, позволяющего конструировать набор пар ключ-значение, представляющих поля формы, для последующей отправки на сервер с помощью метода  send() объекта XMLHttpRequest.
Отправка формы целиком:
 
var form = document.getElementById('id_form');
 
var formData = new FormData(form);
 
var xhr = new XMLHttpRequest();
 
xhr.upload.addEventListener("progress", function(e) {
 
if (e.lengthComputable) {
 
var percentage = Math.round((e.loaded * 100) / e.total); 
 
$('#id_div').find('#id_percent').text(percentage+'%');
 
}
 
}, false);
 
       
 
xhr.onreadystatechange = function() {
 
if (xhr.readyState == 4) {
 
var xml=xhr.responseXML;
 
var result = xml.getElementsByTagName('result')[0].firstChild.data;      
 
var data="";
 
if(result!=""){
 
data=result;
 
}
 
}};
 
xhr.open("POST", url); 
 
xhr.send(formData);
 
 
 
Отправка только файлов:
 
<input id="input_upload_file" type="file" name="files[]" multiple >
 
var fileInput = document.getElementById('input_upload_file');
 
var files = fileInput.files[0];
 
var formData = new FormData();
 
formData.append('files[]', files);    
 
var xhr = new XMLHttpRequest();
 
xhr.upload.addEventListener("progress", function(e) {
 
if (e.lengthComputable) {
 
var percentage = Math.round((e.loaded * 100) / e.total); 
 
$('#id_div').find('#id_percent').text(percentage+'%');
 
}
 
}, false);
 
       
 
xhr.onreadystatechange = function() {
 
if (xhr.readyState == 4) {
 
var xml=xhr.responseXML;
 
var result = xml.getElementsByTagName('result')[0].firstChild.data;      
 
var data="";
 
if(result!=""){
 
data=result;
 
}
 
}};
 
xhr.open("POST", url); 
 
xhr.send(formData);