2012-04-12 4 views
14

Я использую плагин Blueimp Jquery File Upload для загрузки файлов асинхронно. Он работает хорошо в большинстве других браузеров (с несколькими незначительными проблемами) - в IE я вижу эту проблему, что вызовы «done», «stop», «always», «complete» и некоторые другие события не вызываются.blueimp jquery file upload - «done», «complete» callbacks не работает для IE 9

В процессе отладки я добавил console.logs в «done», «fail», «always» и добавил «полный» метод к запросу 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).

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

Спасибо!

ответ

19

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

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

+1

как мы можем это сделать для приложения rails? – CanCeylan

+0

@CanCeylan: render: text => {...} .to_json вместо render: json => {...} – mkk

+0

@tanushree благодарю вас за то, что нашли время, чтобы записать этот ответ. Он исправил проблему, которую я отлаживал некоторое время. – PhysX

6

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

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

+8

Более подробную информацию и Ill вы можете повысить. – guiomie

0

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

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

+0

Вы могли анализировать результат XML? Мне нужно получить ключевое имя загруженного файла, я могу видеть его в ответе XML, но 'data.result' не определен с помощью метода' done'. Похоже, это связано с этим - https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads#cross-site-iframe-transport-uploads. Знать об обходных решениях? – Chris

+0

@chris прошло некоторое время, так как я посмотрел на это, и я не уверен на 100%, я понимаю, что вы видите. Но я просто проверил свой код, и я получаю доступ к этой загрузке, как это, в ** on ('fileuploaddone', function (e, data) {...} ** обратный вызов так: ** file = data.files [ 0] ** – hraynaud