Можно ли загрузить файл только через $ .ajax (параметры) или xhr.send (файл)?

Я использую файл 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 или нет.

12
задан lisak 24 May 2011 в 11:46
поделиться