Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > как правильно сделать "ждите, идет загрузка файла"


Автор: PyccHeBa 6.10.2007, 02:58
Нужно сделать, чтобы появилось сообщение, пока идет загрузка файла (до 40 сек). Как это сделать? Событие onClick на ссылке может вызвать это сообщение, но как его убрать, когда файл загрузился?

Упрощенно
<a href='download.php?parametrs'>download</a>


------------------------------------------------------
download.php
<?php

.....
.....
header('Content-type: application/xls');
header('Content-Disposition: attachment; filename='file.xls');
readfile('file.xls');

?>

Автор: Ghirik 6.10.2007, 06:55
А флэш использовать не хотите? Вот посмотрите, какой есть http://swfupload.mammon.se/.

Автор: fidres 9.10.2007, 08:46
ну а яваскрипт-то тут причём, если загрузка средствами php производится?!
вот и надо средствами php отслеживать статус загрузки...
JavaScript хоть и потомок C, но всё же не столь силён...
хотел было добавить, но сдержался.
 smile 

Автор: PyccHeBa 10.10.2007, 05:38
С Флешем разбираться нужно долго, да и код больше станет. Ради такой мелочи как надпись "ждите" не стоит так усложнять жизнь.
А вот на php сделать это хорошая идея! Попробую, потом отпишусь

Автор: Madferit 19.6.2008, 12:50
Для меня актуальна та же проблема:

Пользователь инициирует событи на стороне сервера.
По событию сервер возвращает какой-то файл (пользователь получает диалог "Open"|"Save"|"Cancel").

Можно ли подписаться на какое-то Javascript событие, чтобы узнать что файл готов к загрузке (момент появление диалога) ?


Автор: Ghirik 19.6.2008, 23:24
Цитата

По событию сервер возвращает какой-то файл 


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

Включите в отдаваемую сервером страницу такой кусочек:

Код

<script type="text/javascript">
<!--
function on() {
    alert('Ok!');
};
window.onload = on;
//-->
</script>


Ну, вместо alert() - ваш JavaScript.

Автор: Sannis 20.6.2008, 01:40
Цитата(Madferit @  19.6.2008,  12:50 Найти цитируемый пост)
Пользователь инициирует событи на стороне сервера.
По событию сервер возвращает какой-то файл (пользователь получает диалог "Open"|"Save"|"Cancel").

Какимим средствами Javascript вы это осуществляете?

Автор: Madferit 7.7.2008, 17:37
Sannis,

Цитата


Какимим средствами Javascript вы это осуществляете?



Событие на сервере инициируется простым Http-запросом, на стороне сервера специальным образом формируется Http-ответ, диалог "Open"|"Save"|"Cancel" отображается самим браузером в ответ на полученый Http-ответ, без каких либо телодвижений на стороне JavaScript.

Ghirik,

Цитата

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


Браузер получает не html-документ, а произольного формата файл (например pdf, zip, jpeg... да все что угодно). Поэтому, я ищу каким образом можно отловить событие получения файла с сервера (фактически, момент появление диалога "Open"|"Save"|"Cancel") на стороне страницы, что инициировала запрос.  

Автор: Sannis 7.7.2008, 21:23
Цитата

Событие на сервере инициируется простым Http-запросом, на стороне сервера специальным образом формируется Http-ответ, диалог "Open"|"Save"|"Cancel" отображается самим браузером в ответ на полученый Http-ответ, без каких либо телодвижений на стороне JavaScript.

Т.е. просто пользователь нажимает на ссылку, указывающую на скрипт, отдающий файл?

Автор: Madferit 8.7.2008, 13:32
Sannis

Пользователь каким либо образом инициирует Http-запрос к серверу. 

Например:
Клик по <Input type="Submit" />
Клик по ссылке www.mysite.com/DownloadFile?fileId=xxxxxx
Инициирует выполнение скрипта который будет выполнять одно из перечисленных выше действий

А сам файл отдается серверной частью. Реализованной, например, с помощью asp.net 

Автор: Sannis 8.7.2008, 13:55
Единственное, что можно сделать - повесить вызов функции на onclick этого элемента. Но тогда это может не везде выполнится и будет происходить до появления окна. Иначе никак :/

Автор: Madferit 10.11.2008, 14:38
Нашел решение, не ахти какое, но в моем случае подходит

Идея такая - использовать cookie для того чтобы среагировать на момент старта загрузки: клиент в ответ на запрос файла ждет не только файл но и cookie. Сервер, в свою очередь, в ответ на запрос отдает не только файл но и ожидаемый cookie.

Подробнее:

1. В HTML страницы с которой инициируется загрузка файла, добавляется невидимый iframe:
Код

<iframe id="downloadFileIframe" style="display: none" ></iframe>


2. Javascript, который выполняется, когда пользователь инициирует загрузку:
Код

//показать индикатор загрузки
document.getElementById('processIndicator').style.display = 'block';
//для свойства src невидимого iframe установить URL серверного обработчика, который вернет файл
document.getElementById('downloadFileIframe').src='DownloadFile.ashx?some_parametes_passed_here';
//стартовать таймер, который будет дергать функцию, проверяющую не установлен ли ожидаемый cookie
setInterval(waitForDownloadStart); 
 

3. Javascript функция, которая определяет не установлен ли ожидаемый cookie
Код

function waitForDownloadStart() 
 {
     //проверить установлен ли cookie (код функции опущен)
     var cookieIsSet = isCookieSet();
     if (cookieIsSet)
     {
          //спрятать индикатор загрузки
          document.getElementById('processIndicator').style.display = 'none';
         
          //отменить таймер опрашивающий cookie (код опущен)
     }
}


4. Cерверный обработчик отдает в ответ на запрос не только файл но и устанавливает cookie, что ждет клиент. Код опущен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)