Обнаружить, был ли файл передан в браузер? .. вроде - PullRequest
2 голосов
/ 09 сентября 2009

У меня есть кнопка, которая устанавливает window.location в файл php, который генерирует канал, который затем загружается. Однако, поскольку файлы различаются по размеру в зависимости от того, какие данные помещаются в канал, иногда может потребоваться некоторое время от нажатия кнопки до появления диалогового окна файла.

То, что я хотел бы сделать, это нажать кнопку и отображать loading.gif до тех пор, пока диалог / файл не будет завершен.

Любые идеи будут круто!

Приветствия

Ответы [ 7 ]

5 голосов
/ 15 сентября 2009

Я не совсем уверен, зачем вам вообще проверять размер файла? Если вы используете ajax для динамического выполнения get / post, и все, что вы делаете, это пытаетесь показать значок загрузки, пока это происходит, довольно просто вывести индикатор асинхронной активности. Например, с помощью jquery:

$("#loading").ajaxStart(function(){
   $(this).show();
});

$("#loading").ajaxStop(function(){
   $(this).hide();
});

$("#feeds").load("feeds.php?id=89734258972347895");

Приведенный выше код устанавливает объект DOM с идентификатором «loading» для отображения и скрытия, когда любой асинхронный запрос был инициирован и остановлен. .load (url) загружает содержимое URL в div #feeds. Если вы устанавливаете заголовок content-disposition: attachment с помощью php, он автоматически запустит окно загрузки файла, даже если он был асинхронно загружен в div. Это также возможно без jquery, конечно, есть только куча javascript совместимости браузера, и это не так просто, как просто подписаться на события ajaxStart и ajaxStop, чтобы показать и скрыть загрузку img.

Josh

1 голос
/ 17 сентября 2009

Метод, который я использовал в прошлом, работает следующим образом ...

  • Установите window.location для страницы загрузки и передайте страницу назначения в строке запроса. На странице загрузки должен отображаться анимированный GIF-файл или все, что вы предпочитаете, чтобы продемонстрировать, что происходит обработка. Страница загрузки должна НЕМЕДЛЕННО перенаправить на страницу назначения, переданную в строке запроса (вместе с любыми другими применимыми параметрами строки запроса).

РЕДАКТИРОВАТЬ: страница загрузки должна перенаправить на страницу назначения, используя javascript (установите window.location на URL-адрес, указанный в строке запроса). Это важный момент, потому что если вы перенаправляете на стороне сервера, страница загрузки не будет отображаться.

РЕДАКТИРОВАТЬ 2: Если ваша страница загрузки представляет собой php-файл, вы можете проверить размер файла для загрузки и отобразить примерное время загрузки для пользователя (вместе с анимированным GIF-файлом «загрузки») или еще много чего.

  • Страница назначения должна отображаться с включенной буферизацией (вызовите ob_start (), прежде чем рендерить какой-либо контент). При включенной буферизации в браузер ничего не отправляется, пока не будет отображена вся страница. В то же время ваша страница загрузки с шага 1 будет по-прежнему отображаться.
1 голос
/ 15 сентября 2009

Это старая школа, но это можно сделать очень легко с помощью push-сервера

<?php
  $separator = "end_of_section_marker";
  header('Content-type: multipart/x-mixed-replace;boundary=$separator');
  print "\n--$separator\n";
  print "Content-type: text/html\n\n";
  // Send placeholder message here
  print "--$separator\n";
  ob_flush();
  flush();
  // Start long processing here
  print "Content-type: text/html\n\n";
  // send data here
  print "--$separator--\n";
?>

Просто настройте типы контента для данных, которые вы отправляете. $ separator может принимать любое значение, если оно не отображается в отправляемых данных.

1 голос
/ 09 сентября 2009

перед настройкой window.location вы можете отобразить скрытый div с вашим gif

0 голосов
/ 18 сентября 2009

Просто заставьте скрипт генерирования RSS показывать желаемое изображение (выведите HTML-код изображения, затем очистите буфер вывода и запустите генерацию данных). В конце генерации данных сделайте:

<?php
print '<script>window.location = "http://www.newlocation.com"</script>'

Вот и все.

0 голосов
/ 15 сентября 2009

Можно ли использовать iframe для загрузки канала, а затем с помощью интервала проверить состояние готовности iframe / документа?Таким образом, процесс будет выглядеть следующим образом:

  • Загрузить окно, содержащее iframe ширины и высоты 100% и load.gif поверх iframe.
  • Установить проверку таймера для iframe.Свойство contentWindow.document.readyState
  • Как только readyState == выполнено, покажите диалоговое окно сохранения файла.

Одним из недостатков является то, что для большинства браузеров файл PHP должен быть одинаковымдомен (в IE вы можете просто проверить свойство readyState в iframe).

0 голосов
/ 12 сентября 2009

Вам придется использовать AJAX для связи с сервером, чтобы узнать точный размер загружаемого файла. Тогда у вас есть что проверить. Невозможно узнать размер ожидаемой полезной нагрузки только со стороны клиента.

...