Релоад страницы после загрузки файла.

akxxiv

Новичок
Релоад страницы после загрузки файла.

Заказчик сказал, что хочет чтоюы после загрузки файла, страница, где находится ссылка на него перезагружалась с сообщением, мол спасибо что скачали и т.д. Так же заказчик говорит, что где-то видел подобное. Но где конкретно сказать не может.
Вопрос: возможно ли отловить момент, когда файл скачается и после этого редиректить страницу? Если да, то как. Спасибо.
 

AndreyKl

Новичок
Ну всё просто. После закачки файла и всех действий с ним перед выходом ставишь header('Location: need_url.php?param=file_uploaded');

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

akxxiv

Новичок
Нет, ты не совсем понял. Фал не закачивается на сервер, а наоборот, скачивается. Например лежит себе на сервере файл file.zip. На сайте есть ссылка на него http://site.ru/file.zip. Пользователь кликает по ссылке и скачивает файл. Как только файл загружен, страница с ссылкой должна обновиться с сообщением "Спасибо что скачали ... "

Я чесно говоря не вижу способа. Но заказчик божится что видел такое. Вот я и спрашиваю, может действительно можно?
 

ast-ross

Новичок
Автор оригинала: akxxiv
Я чесно говоря не вижу способа. Но заказчик божится что видел такое. Вот я и спрашиваю, может действительно можно?
На JS не знаю а на php реализовать раз плюнуть, надо писать свой скрипт выдачи файла клиенту а не давать просто ссылку на обработку апачу.
 

akxxiv

Новичок
При чем тут выдача? Сервер, пусть даже php выдал файл пользователю, после чего он (пользователь) грузит в зависимости от скорости разное кол-во времени. Скрипт уже давно забыл о нем, а он все грузит.
 

ast-ross

Новичок
Ошибаешься, если писать свой алгоритм выдачи файла в поток (читаешь файл fopen, fseek, freed) и так до последнего байта и выдаешь после правильных заголовков то твой скрипт ничего не забудет. Все время выдачи файла он будет работать (не забыть выставить таймаут в 0) и как достигнет конца файла делаешь ридерект.
Вот тебе к размышлению:
http://phpclub.ru/talk/search.php?action=showresults&searchid=1356851&sortby=after&sortorder=descending

-~{}~ 10.10.06 16:26:

Вернее даже немного не так. Один скрипт где висит линк ссылаеться на твой скрипт выдачи файла как только он начинает качаться пишешь об этом в базу как только закончил качаться помечаешь, а первый твой скрипт через sleep() в безконечном цикле смотрит в базу при чем цикл активируешь как только пользователь запустил твой скрипт выдачи файла. Ну это одна из реализаций на вскидку...

-~{}~ 10.10.06 16:44:

я нечто подобное делал для одного раздела ПО, только там мне надо было фиксировать что пользователь докачал файл до конца что бы увеличить счетчик загрузок на 1. Т.е счетчик фиксирует только 100% загруженный файл.
 

Vital_N

Новичок
Автор оригинала: ast-ross а первый твой скрипт через sleep() в безконечном цикле смотрит в базу при чем цикл активируешь как только пользователь запустил твой скрипт выдачи файла. Ну это одна из реализаций на вскидку...
sleep, бесконечный цикл....
думаю не стОит
 

phprus

Moderator
Команда форума
ast-ross
как достигнет конца файла делаешь ридерект.
Как ридерект то делать? После того как отправлено тело ответа уже нельзя выдать заголовок location.
 

ast-ross

Новичок
Автор оригинала: phprus
Как ридерект то делать? После того как отправлено тело ответа уже нельзя выдать заголовок location.
Во первых это можно сделать через JS, но опять же можно же в самом начале скрипта (до каких либо заголовков) проверать докачен ли файл.

Я вижу идея не совсем понятна...

В общем скрипт, назовем его download.php в нем даеться ссылка на скрипт выдачи файла назовем его get.php
в download.php ссылку даем типа <a href=./get.php?file=my_file.tar.gz&sessid=you_sess_id>Загрузить</a>
Идентификатор сессии даем что бы стартовать не новую сессию а использовать ту что запущена в download.php ну и передаем имя файла (можно и лучше передавать числовой идентификатор файла, а по нему из базы вытаскивать путь до него и имя). В get.php зная путь до файла считываем его через fread и выдаем после заголовков (в зависимости от миме типа) в поток через echo естественно все это через fseek как только достигаеться EOF (end of file) в сессию пишем что то типа $_SESSION['file'][$_GET['file']]=true;
Теперь о download.php если пугает цикл то можно повешать блоху 1x1 через <iframe src=./check_download.php?file=my_file.tar.gz&sessid=you_sess_id></iframe> в котором в безконечном цикле проверяем появилась ли в сессии переменная $_SESSION['file'][$_GET['file']] если да то через java script top.document.location.href=./thankyou.html в нем и пишите типа спасибо.

Опять же это один из способов можно и без блохи а в download.php через sleep(); flush(); в цикле проверять наличие переменной в сессии и как появиться можно и через header() и через java-script редиректом отправить куда надо...

В общем вот он алгоритм на ладони, осталось только в код переложить...

-~{}~ 11.10.06 11:06:

Автор оригинала: Vital_N
sleep, бесконечный цикл....
думаю не стОит
А что в этом такого? просто в цикле flush() давать и все будет пучком...
 

Vital_N

Новичок
Автор оригинала: ast-ross

А что в этом такого? просто в цикле flush() давать и все будет пучком...
бесконечные циклы - идея плохая сама по себе - а если у тебя что-то глюканет и цикл не завершится? сколько он у тебя жить будет? пока процесс не слетит?
 

ast-ross

Новичок
Автор оригинала: Vital_N
бесконечные циклы - идея плохая сама по себе - а если у тебя что-то глюканет и цикл не завершится? сколько он у тебя жить будет? пока процесс не слетит?
Ну если не нравиться цикл то можно авторефреш повешать
<meta http-equiv='refresh' content='30; URL=./download?blablabla'>
А можно и цикл который будет вываливаться если к примеру каждые 5 сек не будет обновляться к примеру $_SESSION['range'] она в свою очередь обновляеться в get.php туда можно писать сколько уже байт отданно, а download.php редирект делать по событию как только $_SESSION['range'] станет равна полному размеру файла.

В общем было бы желание, алгоритм всегда составить можно...

-~{}~ 11.10.06 16:33:

а можно авторефрешь в блохе (iframe) сделать и поставить не 30 а 1 секунду и проверять там появилась переменная или нет, как только появилась переписать url родителю.
 

Solid

Drosera anglica
Перечитал ещё раз. ИМХО - идиотизм. Или так: http://ee.php.net/manual/ru/ref.apache.php, или никак :)

Ещё способ - читать лог... но это уже изврат. Может быть, если сервер апач, можно повесить на файлы handler.
 
Сверху