Отправка формы с файлами через AJAX
На основе статьи http://javascript.ru/node/7686
function sendform(form, url, fn){
if(typeof 'form' != 'object') var form = document.forms[form];
//var url = window.location;
var xhr = getHttpRequest();
xhr.onreadystatechange = function () {
if (this.readyState == 4) {
if(this.status == 200) {
/* ... все ок! смотрим в this.responseText ... */
var json = text2obj(xhr.responseText);
if(fn) fn(json);
} else {
/* ... ошибка! ... */
}
}
};
//var files = elem.files;
xhr.open("POST", url);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
//Если реализован интерфейс FormData, то лучшего и не пожелаешь
if(typeof FormData == 'function'){
var fdata = new FormData(form);
xhr.send(fdata);
}
else {
var body = '';
var readers = new Array();
var filenames = new Array();
var inputnames = new Array();
var boundary = "--------------"+(new Date()).getTime() + (Math.floor(Math.random()*(999999-100000)+100000));
var elements = form.elements;
for(i = 0; i < elements.length; i++){
if(elements[i].type != 'file'){
body += "--" + boundary + "\r\n";
body += 'Content-Disposition: form-data; name="'+elements[i].name+'"'+'\n';
body += '\r\n';
body += elements[i].value;
body += '\r\n';
}
else {
var files = elements[i].files;
for(j = 0; j < files.length; j++){
var reader = new FileReader();
var file = files[j];
filenames.push(file.name);
inputnames.push(elements[i].name);
reader.onload = function(){
var done = true;
for(var i = 0; i < readers.length; i++){
if(readers[i].readyState != FileReader.DONE){ done = false; }
}
if(done) {
//alert('Все файлы загружены');
for(var i = 0; i < readers.length; i++){
body += "--" + boundary + "\r\n";
body += "Content-Disposition: form-data; name='"+inputnames[i]+"'; filename='" + filenames[i] + "'\r\n";
body += "Content-Type: application/octet-stream\r\n\r\n";
body += readers[i].result + "\r\n";
}
body += "--" + boundary + "--\r\n";
xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary);
if(xhr.sendAsBinary) {
// только для firefox
xhr.sendAsBinary(body);
} else {
// chrome (так гласит спецификация W3C)
xhr.send(body);
}
}
};
reader.readAsBinaryString(file);
readers.push(reader);
}
}
}
}
}
|
А что такое text2obj?
Функция для преобразования JSON в объект Javascript.
Без примера не понятно почему столько много букв, и оценка -1
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.