Скачал ли файл полностью?

FedY@

Новичок
Скачал ли файл полностью?

Есть вот такая задачка:
Юзер начинает скачивать файл:
1) может скачивать как одним потоком так и неограниченым количеством потоков
2) юзер может докачивать файл
РНР скрипт отдаёт ему файл побайтно (по кб), ну и умеет отдавать кусками (для потоков)!

Нужно определить скачан ли файл полностью? И после этого запретить скачивание этого файла....

Мой алгоритм: суммировать отданное количество данных юзеру со всех потоков и записивать в БД! В конце проверять с самим файлов эту сумму... ну и делать выводы запрещать или нет! Тут есть несколько нюансов, как узнать нажал ли юзер СТОП? Может Юзер пришёл докачивать ? Или заново качать файл ?

Помогите пожалуйсто с задачкой.... Очень вас прошу!
 

Popoff

popoff.donetsk.ua
1. Можно запрещать повторно скачивать, если пользователь пытается скачать с самого начала, а докачка - всегда разрешена. Большинство систем скачивания с докачкой не начнут скачивание, если нельзя начать скачивание с начала.

2. Можно разрешить скачивание до определённого момента времени.

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

FedY@

Новичок
Автор оригинала: Popoff
1. Можно запрещать повторно скачивать, если пользователь пытается скачать с самого начала, а докачка - всегда разрешена. Большинство систем скачивания с докачкой не начнут скачивание, если нельзя начать скачивание с начала.
Ну это уже не называется докачкой... Точнее если человек качал не докачивальщиком а простым ИЕ... и файл был удалён, то он не сможет снова его скачать!

2. Можно разрешить скачивание до определённого момента времени.
Не подходит, а если у юезар пропадает инет и время исходит ? Ему уже точно не получить файлик!

3. Если, к примеру, твои файлы продаются, то не вижу никакой необходимости запрещать доступ после того, как пользователь скачал файл. Он же заплатил - вдруг ты последний байт отдал уже и запислал в бд, что всё отдано, а у него именно на последнем байте связь оборвалась. Или он удалил файл случайно...
Да, файлы будут продаватся.... но могу сказать что дать кому-то свой логин и пароль чтоб кто - то еще скачал не будет никакой проблемы! ;) Так что этот метод скачивания файла один раз - запретит роздачу своих логинов и паролей другим пользователям!
 

Zetruger

ivan.chistyakov.name
ну если охота так жестко контролировать пользователей, то идея с логированием запрошенных кусков конечно интересна

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

как же отследить что пользователь отвалился?

с точки зрения TCP это довольно легко, придет специальный сигнал в ввиде пакета с размером 0 байт

как проверить из PHP - не знаю


есть альтернативная идея:
написать мини демон на PHP для отдачи файлов по протоколу FTP

алгоритм такой
пользователь нажимает скачать файл
загрузившийся скрипт запускает демон на рандомном порту
и перенаправляет пользователя через 5 секунд на скачку файлы с этого демона

загрузчик подсоединяется к FTP серверу, запрашивает какой-то блок данных в пассивном режиме, демон стартует еще один демон уже непосредственно для передачи данных

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

при неудаче, не помечается
 

FedY@

Новичок
Мда... с демонами сильно закручено :( ... есть ли какой-то способ попроще?

как же отследить что пользователь отвалился?
каждый кусок логировать и записивать в БД.... если пользователь запросил кусок заново (попал в диапазон который он уже качал)... считать что пользователь качает файлик заново... но это сильно тоже заморочено, может есть проще выход ?
 

Zetruger

ivan.chistyakov.name
каждый кусок логировать и записивать в БД.... если пользователь запросил кусок заново (попал в диапазон который он уже качал)... считать что пользователь качает файлик заново... но это сильно тоже заморочено, может есть проще выход ?
если был запрошен кусок, но не докачен!!! как ты это узнаешь?

-~{}~ 24.07.07 14:31:

Мда... с демонами сильно закручено ... есть ли какой-то способ попроще?
это звучит страшно для неопытных пользователей, на самом деле програмка элементарнейшая пишется за 1 день
 

FedY@

Новичок
если был запрошен кусок, но не докачен!!! как ты это узнаешь?
В этом и проблема.... я сейчас пока читаю документацию на РНР.Нет про php manual/features/connection handling, ignore_user_abort, register_shutdown_function, connection_aborted).
_http://www.php.net/manual/ru/features.connection-handling.php

-~{}~ 24.07.07 15:21:

Думаю всё упростится... если разрешить юзеру докачивать НО качать только в один поток! тоесть следить только за одним куском, вот пример:
Юзер начал качать... скачал 100б (файл 200б) ... если он остановил и заново начал докачивать пойдёт 101б.. тоесть скрипт считает что он докачует суммируем дальше, а если начинает с 1б... то значит он качает файл заново, счётчик обнуляем...

Теперь проблема в след. как сделать чтоб скрипт отдавал файл в один поток но с поддержкой докачивания ?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
FedY@
почему? почему никак не выйдет сделать такую штуку? (думаю ответ: "Никак"... ето ответ ленивого программиста!)
В самом деле?
ну так не ленитесь и воспользуйтесь поиском по форуму.
тема обсуждается регулярно.

Когда Вы сможете гарантировать, что отданый последний байт дошёл до юзера, что у него, например, не выключили свет, не вылетела винда или он ресет не пнул ногой ещё _миллион причин_ тогда Вы с увереностью сможете утверждать что юзер скачал файл.
 

Zetruger

ivan.chistyakov.name
FedY@
в "Chapter 40. Connection handling" есть все что тебе нужно
алгоритм элементарный
должно все работать тип-топ

-~{}~ 24.07.07 17:10:

Mr_Max
если на момент посылки пользователю последнего байта, тот выключит компьютер и пакет на найдет своего места назначения, то сервер получит сообщения что клиент оборвал соединение и это (оказывается, я просто не знал) можно отслеить элементарно соответственно недокаченный блок данных останется доступным
 

FedY@

Новичок
Автор оригинала: Mr_Max
FedY@

В самом деле?
ну так не ленитесь и воспользуйтесь поиском по форуму.
тема обсуждается регулярно.

Когда Вы сможете гарантировать, что отданый последний байт дошёл до юзера, что у него, например, не выключили свет, не вылетела винда или он ресет не пнул ногой ещё _миллион причин_ тогда Вы с увереностью сможете утверждать что юзер скачал файл.
А вот если без екстремальных ситуаций со стороны юзера, то это возможно... думаю дать юезру 2 попытки на скачивание на файл... и не более! Первая пусть пролетит... но со второй будет уже более уверен!
 

Zetruger

ivan.chistyakov.name
FedY@
правда есть небольшая вероятность, что сервер успеет все отправить и закроет соединение, а клиент не успеет достать последний пакет из очереди, то тогда произойдет то о чем пишет Mr_Max

2 попытки это правильно, на самом деле можно даже 3 =)
 

FedY@

Новичок
Автор оригинала: bgm
Полезные ссылки на тему контролируемого скачивания:
http://softwaremaniacs.org/blog/2006/04/18/controlled-download/
http://softwaremaniacs.org/blog/2007/01/08/controlled-download-2/
очень интересные и хороши выложенные статьи... но могу сказать одно - там всё на Питоне :(

-~{}~ 24.07.07 19:13:

+ ко всему есть реализация сервера написаном на РНР... но доступа для установки таковых серверов у меня нету :( http://nanoweb.si.kz/

Почитал в ветках писалось про логи... что Апач логирует всё происходящее... где можно про это почитать ?
 

Beavis

Banned
на mp3spy вроде такая штука реализована, но даже там она глючила(( не давала файл нормально докачать
 

FedY@

Новичок
Автор оригинала: Beavis
на mp3spy вроде такая штука реализована, но даже там она глючила(( не давала файл нормально докачать
Я знаю что скрипт реализован на платных мр3 сайтах... на которых ниразу ничего не глючило! На одном сайте было что - от типа ПОПЫТОК, 2-3 попытки на скачивание - у меня 3 раза обрывалось, всё таки я ничего и не скачал - обидно! :*(

-~{}~ 24.07.07 19:31:

На данный момент есть пока что 2 вопроса:
1. может ли Apache узнать, что файл не был успешно передан клиенту
2. как у него об этом узнать

-~{}~ 24.07.07 19:45:

на уровне HTTP на 100% узнать был ли скачан файл невозможно... я так понимаю, что это можно сделать на уровне TCP/IP -> Apache - единственный, кто может что-то сообщить по этому поводу...
 

С.

Продвинутый новичок
Единственная нормальная реализация - лимит в 24 часа на скачивание. Все остальное - усложнение жизни и продавцу, и покупателю.
 

boombick

boombick.org
С.
+1
Не успел - ССЗБ. Если есть проблемы со связью, то не стоит покупать линки на большие файлы, проще заказать их по почте
 

FedY@

Новичок
Автор оригинала: boombick
С.
+1
Не успел - ССЗБ. Если есть проблемы со связью, то не стоит покупать линки на большие файлы, проще заказать их по почте
Таким образом Вы не избаветесь от передачи логина с рук в руки... за 24часа этот файл успеет скачать не один человек....
 
Сверху