Проблема с загрузкой Ajax-файла - PullRequest
6 голосов
/ 08 октября 2009

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

Ответы [ 5 ]

15 голосов
/ 29 марта 2012

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

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

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

$.fileDownload('some/file.pdf')
    .done(function () { alert('File download a success!'); })
    .fail(function () { alert('File download failed!'); });
2 голосов
/ 13 июля 2010

Смотри, это может помочь тебе

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

1 голос
/ 21 декабря 2010

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

if ( ( iframe.document && iframe.document.readyState == 'complete' )
    || iframe.contentDocument )
{
    stopTimer();
    closePopupDialog();
}
1 голос
/ 17 ноября 2009

Смотри, это может помочь тебе

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

0 голосов
/ 09 октября 2009

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...