Загрузка файла blueimp jquery - выполнена, полные обратные вызовы не работают для IE 9

Я использую плагин Blueimp Jquery File Upload для асинхронной загрузки файлов. Он хорошо работает в большинстве других браузеров (с несколькими незначительными проблемами) - в IE я вижу эту проблему, заключающуюся в том, что обратные вызовы «готово», «остановить», «всегда», «завершить» и некоторые другие обратные вызовы событий не вызываются.

Во время отладки я добавил console.logs в «выполнено», «сбой», «всегда» и добавил «полный» метод в запрос ajax в функции _onSend (в jquery.fileupload.js), но ни один из них кажется, вызывается в IE.

_onSend: function (e, data) {
        var that = this,
            jqXHR,
            slot,
            pipe,
            options = that._getAJAXSettings(data),
            send = function (resolve, args) {
                that._sending += 1;
                jqXHR = jqXHR || (
                    (resolve !== false &&
                    that._trigger('send', e, options) !== false &&
                    (that._chunkedUpload(options) || $.ajax(options))) ||
                    that._getXHRPromise(false, options.context, args)
                ).complete(function (result, textStatus, jqXHR) {
                    console.log("complete"); 
                }).done(function (result, textStatus, jqXHR) {
                    console.log("done", result); 
                }).fail(function (jqXHR, textStatus, errorThrown) {
                    console.log("fail", result); 
                }).always(function (a1, a2, a3) {
                    console.log("done", result); 

                   }
                });
                return jqXHR;
            };

[код плагина обрезан для удобства чтения]

Я понимаю, что в IE 9 jquery.iframe-transport.js используется для загрузки файла (поскольку загрузка файлов XHR не поддерживается в IE).

Я не уверен, как мне исправить/отладить эту проблему.

Спасибо!


person tanushree    schedule 12.04.2012    source источник


Ответы (3)


Событие done запускается, если для типа содержимого ответа установлено значение «text/html» или «text/plain» (вместо application/json), когда json возвращается с сервера. Это применимо только для браузеров, которые не поддерживают загрузку файлов XHR (например, IE9) и в которых подключаемый модуль blueimp вместо этого использует транспорт IFrame.

Связанная информация в разделе «Согласование контента» в документации плагина: https://github.com/blueimp/jQuery-File-Upload/wiki/Setup

person tanushree    schedule 27.04.2012
comment
как мы можем сделать это для приложения rails? - person CanCeylan; 24.12.2012
comment
@CanCeylan: render :text =› { ... }.to_json вместо render :json =› { ... } - person mkk; 25.03.2013
comment
@tanushree спасибо, что нашли время написать этот ответ. Это устранило проблему, которую я отлаживал некоторое время. - person PhysX; 28.03.2013
comment
@PhysX Рад, что это помогло! Я тоже долго пытался решить эту проблему. - person tanushree; 28.03.2013
comment
Я визуализирую партиал 'js.haml', используя render partial: partial_name и return, все еще в IE 8 и 9, blueimp не работает. Это работает в IE 10. Когда изображения отправляются в IE 8/9, атрибуты formData не находятся в параметрах, поэтому возникает проблема. Может ли кто-нибудь помочь мне в этом. - person Swapnil Chincholkar; 13.09.2013
comment
@tanushree Обратите внимание, что, согласно документам, обратный вызов done также вызывается, когда ответ JSON содержит свойство error (для описанного вами случая) github.com/blueimp/jQuery-File-Upload/wiki/Options#done - person Epoc; 05.01.2015

Для справки, я столкнулся с этой проблемой при загрузке напрямую на S3, теперь, когда их функция CORS позволяет это сделать.

Решение состояло в том, чтобы установить для success_action_status значение «200», после чего событие Done срабатывало правильно.

person Calvin Correli    schedule 08.12.2012

Если у кого-то все еще есть проблема с прямой загрузкой на S3, решение состоит в том, чтобы добавить поле success_action_status со значением «201». Убедитесь, что вы включили его как часть данных политики, поскольку они должны совпадать.

По-видимому, при получении загрузки из IE9 S3 вернет пустую строку. Чтобы он возвращал XML, который нужен загрузчику файлов, вы должны указать ему вернуть статус 201.

person hraynaud    schedule 05.08.2015
comment
Удалось ли вам проанализировать результат XML? Мне нужно получить ключевое имя загруженного файла, я вижу его в ответе XML, но data.result не определено с помощью метода done. Похоже, это связано с этим - github.com/blueimp/jQuery-File-Upload/wiki/. Знаете обходные пути? - person Chris; 11.08.2016
comment
@chris, я давно не смотрел на это, и я не уверен на 100%, что понимаю проблему, которую вы видите. Но я только что проверил свой код и получаю доступ к загрузке в обратном вызове on('fileuploaddone', function(e, data) {...} следующим образом: file = data.files[0] - person hraynaud; 11.08.2016