Я использую файл api и xhr2 spec.Я создал загрузчик (поддерживаемый 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);
, который не возвращает Promise, который я могу использовать в функции рекурсии.
Мой код выглядит так:
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)
, если options.data = FormData
, но как мне сделать так, чтобы xhr.send(file)
?
ИЗД.это и если я установлю options.data = file;затем $ .ajax (options) выполняет xhr.send (theFile);но с ошибкой Error: INVALID_STATE_ERR: DOM Exception 11
и запрос отправляется как запрос POST multipart / form-data, но без составного тела с файлом в нем
И если я поместил его в options.data = {file: file};
оно сериализуется независимо от того, установлено ли для свойства processData
значение true или нет.