Загрузка файла jQuery застряла в состоянии ожидания с IE10, файл нулевого байта

Я использую этот плагин jQuery и вижу на моем сайте те же результаты, которые я могу воспроизвести в этой демонстрации:

http://blueimp.github.io/jQuery-File-Upload/

Хотя демо-версия говорит:Сервер загрузки в данный момент недоступен " Вы все еще можете воссоздать проблему, перейдя в демонстрационную версию и попытавшись загрузить файл нулевого байта (должен иметь расширение JPG, GIF или PNG, поскольку это все, что они позволяют).

В FireFox и Chrome вы увидите, что он пытается POST файл нулевого байта. В IE10, если вы просматриваете вкладку сети в инструментах разработчика, вы увидите объект XMLHTTPRequest, застрявший в "в ожидании» государство. Если вы загрузите файл с ненулевым размером в IE10, вы также увидите его POST данные.

Я искал и нашел только пару других людей, жалующихся на проблемы с нулевыми байтовыми файлами в IE10. Они не используют тот же плагин jQuery, что и я, поэтому я думаю, что это общая проблема IE10. Кроме того, единственный ответ, который я нашел до сих пор, - не разрешать пользователям загружать файлы с нулевым байтом. Я хотел бы поддерживать нулевые байтовые файлы, если это возможно, они используются в моем приложении, и я использую их время от времени, поэтому кто я такой, чтобы называть своих пользователей сумасшедшими за то, что они хотят эту функцию.

Какие у меня варианты?

 Ohgodwhy07 июн. 2013 г., 07:06
Вы'Возможно, потребуется использовать что-то вроде HTML 5 File Reader API, чтобы проверить размер файла при загрузке, и, возможно, библиотеку, такую как Modernizr, чтобы обнаружить IE10, а затем опубликовать его в любом случае ... это может быть обходной путь

Ответы на вопрос(2)

Я не совсем уверен, что вызвало это, но ядобавлю еще немного информации в микс.

Проблема исчезла при использовании окна InPrivate. Затем я попытался очистить кеш, очистить куки и отключить все надстройки. Это не решило проблему.

Затем я сделал сброс IE из View | Настройки интернета | Вкладка «Дополнительно» | Сброс настроек Internet Explorer. Я заставил пользователя сохранить свои настройки, такие как куки и закладки. После перезагрузки проблема ушла. Поэтому я предполагаю, что за это может отвечать установка IE.

Если кто-то столкнется с этим, было бы полезно, если бы вы могли запустить пару тестовых сценариев и оставить комментарий. Может быть, мы сможем сузить точную причину и исправить.

Протестируйте добавление своего домена в списокдоверенный» сайты на вкладке «Безопасность» и посмотрите, будет ли это иметь значение.Проверить "Сбросить дополнительные настройки кнопка достигнута из того же места, что обсуждалось в моем предыдущем абзаце.
Решение Вопроса

но не имея этого, это будет мой ответ:

$(elem).fileupload({
    add: function(e, data) {
        var file = data.files[0];
        if (file.size == 0 && ie >= 10) {
            ajaxPostFileNameOnly(file.name);
        }
        else {
            data.submit();
        }
    }
});

т.е. это глобальная переменная в моем приложении, установленная на версию IE, или 0, если не IE. Я знаю, что обнаружение функций обычно лучше, но в этом случае я не уверен, как обнаружить эту странную проблему, и поскольку некоторые браузеры всегда сообщают о нулевом размере файла (я думаю, Safari), я также могу 'Я просто всегда доверяю этому.

AjaxPostFileNameOnly будет функцией, которая просто делает простой AJAX-запрос на отправку только имени файла, вместо обычной загрузки файла, которую делает библиотека.

РЕДАКТИРОВАТЬ: я закончил просто делать это на данный момент, что делает IE10 работать как предыдущие версии IE для этой библиотеки загрузки файлов и просто использовать iFrame для транспорта.

$(elem).fileupload({
    forceIframeTransport: !!ie
});

и некоторый код для определения версий IE, которые я собрал из пары разных ответов SO (предупреждение, не обнаружит IE11 +, скорее всего будет сообщать о них как IE10):

var ie = (function() {

var undef,
    v = 3,
    div = document.createElement('div'),
    all = div.getElementsByTagName('i');

while (
    div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
    all[0]
);

/*@cc_on
if (/^10/.test(@_jscript_version)) {
    v = 10;
}
@*/

return v > 4 ? v : undef;

} ());

Ваш ответ на вопрос