Проблема с загрузкой Ajax-файла

Я загружаю динамический файл в свое приложение, имитируя ajax с помощью iframes. Что я делаю, так это то, что, когда сделан запрос на загрузку, я создам динамический невидимый iframe и задаю src моего iframe в качестве URL-адреса для загрузки. Я могу успешно загрузить файл, но требуется показать загрузку индикатор после начала загрузки, который должен завершиться, как только появится диалоговое окно загрузки. Я предоставил обратный вызов после создания iframe, чтобы показать успешно загруженный индикатор загрузки, и предоставил другой метод для загрузки onrame iframe, ожидая он будет вызван, когда появится диалог загрузки. Но, к сожалению, это не работает, и из-за этого, даже после завершения загрузки, мой индикатор прогресса все еще там. Я не могу удалить это. Затем я понял, что поскольку тип содержимого ответа не html, он будет обслуживаться отдельным процессом, который ведет к диалогу загрузки, и поэтому мой метод onload никогда не вызывается. Пожалуйста, дайте мне знать решение для этого.

5 ответов

Решение

Вы должны запустить таймер на клиенте, когда будет сделан запрос на загрузку, который проверяет состояние iframe с заданным интервалом:

if ( ( iframe.document && iframe.document.readyState == 'complete' )
    || iframe.contentDocument )
{
    stopTimer();
    closePopupDialog();
}

Я создал плагин jQuery File Download ( Demo), который также исправляет проблему и предоставляет некоторые другие приятные функции. Это в основном дает вам "полный Ajax-подобный" опыт для загрузки файлов (в комплекте даже с обратными вызовами), который обычно невозможен для загрузки файлов. Он работает почти так же, как и некоторые другие ответы с iframe, но имеет некоторые интересные функции, которые я нашел довольно полезными:

  • Пользователь никогда не покидает ту же страницу, с которой он начал загрузку файла, независимо от того, была ли она успешной или произошла ошибка
  • Функции successCallback и failCallback позволяют вам четко указывать поведение пользовательского интерфейса в любой ситуации.
  • В сочетании с пользовательским интерфейсом jQuery разработчик может легко показать модал, сообщающий пользователю, что происходит загрузка файла, расформировать модал после начала загрузки или даже дружески проинформировать пользователя о том, что произошла ошибка. Посмотрите Демо для примера этого.

Вот простая демонстрация варианта использования с использованием исходного кода плагина с обещаниями. Демонстрационная страница также включает в себя множество других примеров "лучшего UX".

$.fileDownload('some/file.pdf')
    .done(function () { alert('File download a success!'); })
    .fail(function () { alert('File download failed!'); });

Видите это, это может помочь вам

http://bytes.com/topic/javascript/answers/610641-file-download-ajax

Видите это, это может помочь вам

http://code.msdn.microsoft.com/AjaxFileDownload

Вы можете использовать менеджер загрузок Flash - Google покажет их множество.

Другой вариант - использовать настоящий AJAX. Просто сделайте запрос на загрузочный URI, и, когда вы получите свой ответ, используйте responseBody вместо атрибута responseText объекта XMLHTTPRequest.

Вам понадобится способ записать это на жесткий диск, что может быть сделано в IE со слабыми ограничениями безопасности и ActiveXObject "Scripting.FileSystemObject". Возможно, вы сможете использовать подход с использованием uri для данных: http://en.wikipedia.org/wiki/Data_URI_scheme с кодировкой base64, но я не уверен, будет ли это работать.

В противном случае вы вернетесь к флэш-памяти, чтобы записать данные, которые вы скачали через ajax, на диск.

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

Другие вопросы по тегам