Я использую файл api и спецификацию xhr2. Я создал загрузчик (поддерживаемый flash для старых браузеров), который использовал FormData
и $. Ajax (options)
, где объект FormData с File
был частью объект options.data
. Все заработало.
Теперь я решил удалить FormData
из-за слабой поддержки браузером. И я не могу придумать, как загрузить файл, кроме
var xhr = new XMLHttpRequest();
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.setRequestHeader("X-File-Name", file.name);
xhr.send(file);
, который не возвращает обещание, которое я могу использовать в функции рекурсии.
Мой код выглядит так:
startUpload: function() {
var that = this;
that.recurseSend(that.queue);
},
_initProgressListener: function (options, file) {
var that = this;
var xhr = $.ajaxSettings.xhr();
options.contentType = 'multipart/form-data';
options.processData = false;
options.type = 'POST';
// WHAT TO DO HERE TO avoid FormData???? What ever I put into options.data - fails
/* THIS WOULD WORK
var formData = new FormData();
formData.append('file', file);
options.data = formData;
*/
if (xhr.upload && xhr.upload.addEventListener) {
xhr.upload.addEventListener('progress', function (e) {
that._onProgress(e, file);
}, false);
options.xhr = function () {
return xhr;
};
}
},
recurseSend: function (queue) {
var file = queue.pop();
if(file != undefined) {
var that = this;
var options = that.options;
that._initProgressListener(options, file);
var send = function() {
jqXHR = ($.ajax(options)).done(function(result, textStatus, jqXHR) {
that._onDone(result, textStatus, jqXHR, file);
queue.stats['successful_uploads']++;
}).fail(function(jqXHR, textStatus, errorThrown) {
that._onFail(jqXHR, textStatus, errorThrown, file);
queue.stats['upload_errors']++;
}).always(function(result, textStatus, jqXHR) {
that._onAlways(result, textStatus, jqXHR, file);
queue.stats['files_queued']--;
that.recurseSend(queue);
});
return jqXHR;
};
this._beforeSend(file);
return send();
}
},
Чтобы сделать его кратким, $. Ajax (options)
преобразуется в xhr.send (formData)
if options. data = FormData
, но как мне разрешить его в xhr.send (file)
?
EDITED: я играл с ним, и если я установил options.data = file; затем $ .ajax (options) выполняет xhr.send (theFile); но с ошибкой Ошибка: INVALID_STATE_ERR: DOM Exception 11
, и запрос отправляется как запрос POST multipart / form-data, но без составного тела с файлом в нем
И если я помещаю его в options.data = {file: file};
сериализуется независимо от того, установлено ли свойство processData
в значение true или нет.