Как организовать однократное скачивание фалов?

dmitrybelyakov

Новичок
Как организовать однократное скачивание фалов?

Добрый день,

Задача, в общем-то проста, после оплаты пользователем одного скачивания файла (mp3) ему выдается ссылка на скрипт, содержащая его уникальный id заказа. Скрипт при вызове берет id заказа и выдает пользователю файл без указания абсолютой ссылки на местоположение самого файла.

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

Также хочется, чтобы можно было resume download использовать пользователю.

Итог:

Задача сводится к следующим вопросам:

1. Как выдавать пользователю файл (с поддержкой resume), не указывая абсолютный url самого фала на сервере?
2. Как определить был ли файл скачан до конца?

Буду рад услышать любые советы.
 

Фанат

oncle terrible
Команда форума
Продвинутые пользователи, к которым ты, по всей видимости, себя причисляешь, умеют пользоваться поиском по форуму.
 

dmitrybelyakov

Новичок
Originally posted by Фанат
Продвинутые пользователи, к которым ты, по всей видимости, себя причисляешь, умеют пользоваться поиском по форуму.
А чё за пафос - без распальцовки можно?
Я умею пользоваться поиском, но хочу обсудить этот вопрос имея возможность попутно задавать спецефические вопросы.

Типа очень умный наверное.
 

Фанат

oncle terrible
Команда форума
Не стоит обсуждать личность отвечающего.
Во-первых, это дурной тон.
Во-вторых, твой ответ может быть справедливо сочтен флеймом с соответствующими последствиями.
Считай это предупредением.
 

lucas

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

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

__________________________________

По теме:

1. Пользователь оплатил файл -- получил ссылку.

2. Открыл ссылку -- получил новую ссылку для скачивания, действительную в течение n секунд.

3. Скачал файл в течение этих n секунд.
 

dmitrybelyakov

Новичок
Originally posted by lucas
Самому с этого (отсутствия распальцовки) нужно было начинать -- нечего лезть в "...для продвинутых".
Хорошо, прошу извинить, что я не продвинутый. И обсуждаю личность отвечающего Фаната. Но послать человека в поиск это по крайней мере не очень умно.


Originally posted by lucas
В таком случае нужно было описать найденные решения и чем они не устроили.
Предлагаемые решения:

1. Использовать fopen для отдачи файла - не подходит, т.к. файлы могут быть большими очень и необходима поддержка resume

2. Создавать под каждый id заказа папку на сервере и использовать http-авторизацию тоже не подходит, т.к. копировать на сервере большие файлы по запросу из папки в папку это тоже плохо.

Originally posted by lucas
По теме:

1. Пользователь оплатил файл -- получил ссылку.

2. Открыл ссылку -- получил новую ссылку для скачивания, действительную в течение n секунд.

3. Скачал файл в течение этих n секунд.
Я ничего не писал про действительность ссылки в n секунд. Это не то, очем я спрашивал.

Я спрашивал можно ли определить был ли фал скачан до конца. И как его в таком случае наиболее грамотно отдавать нужно, с учето вышеописаных требований.

Еще раз приношу извинения, если такие глупые вопросы задевают кого-то из продвинутых лично.
 

lucas

Guest
1. Использовать fopen для отдачи файла - не подходит, т.к. файлы могут быть большими очень и необходима поддержка resume
Не вижу зависимости между использхованием fopen и величиной файла -- читать можно и кусками.
Насчет поддержки докачки -- [m]fseek[/m] еще никто не отменял.

2. Создавать под каждый id заказа папку на сервере и использовать http-авторизацию тоже не подходит, т.к. копировать на сервере большие файлы по запросу из папки в папку это тоже плохо.
Про символические ссылки, конечно, никто не слышал?

Я спрашивал можно ли определить был ли фал скачан до конца.
Нет. Это невозможно.

P. S.: Прекрати ерничать и изображать из себя обиженного -- ты здесь в гостях. А про обязательность пользования поиска написано в правилах форума -- не читал?
 

Фанат

oncle terrible
Команда форума
Но послать человека в поиск это по крайней мере не очень умно.
наоборот.
Неумно - это не воспользоваться поиском и не найти готовый класс, который делает то, что тебе надо.
 

Crazy

Developer
Я спрашивал можно ли определить был ли фал скачан до конца.
Нельзя. Причем, это легко понять, если знать основы сетевых протоколов.

Обсуждалось уже не раз.
 

dmitrybelyakov

Новичок
Originally posted by Crazy
Нельзя. Причем, это легко понять, если знать основы сетевых протоколов.

Обсуждалось уже не раз.
Нельзя отслеживать скачивание файла однократное?
А как в таком случае анализаторы логов выдают статистику по файлам типа finished downloads и unfinished downloads?

Может можно все-таки по логам?
 

Sat

Guest
всё очень просто. unfinished downloads - количество ссылок открытых для скачивания, но которыми ещё не пользовались.
соответственно обратное.
--------------------------------------
Отследить можно попытавшись проследить скачанное количество информации по этой ссылке, количество resume и прочее. Если количество скачанной информации было меньше размера файла, то однозначно это unfinished download.
--------------------------------------
Обычно такое пишут уже не на PHP а на Java Servlet(по крайней мере я так и реализовывал).
--------------------------------------
Для продолжения закачки, надо в скрипте перебить возможность кэширования файла (в пхп по умолчанию запрещён кэш), тогда любой дайнлоадер сможет продолжить закачку.
--------------------------------------
Определить однократное скачивание можно положив куку. Если пользователь ручками убил эту куку, то он потерял и файл и деньги.
--------------------------------------
Отдавание файла через symlink грозит отсутствием возможности регулирования скорости закачки на конкретного пользователя.


--------------------------------------
За всё сказанное не отвечаю, это мои домыслы, как можно реализовать на ПХП, на яве я реализовывал простейший ФТП сервер, который открывал порт по запросу.
 

Crazy

Developer
Автор оригинала: dmitrybelyakov
Нельзя отслеживать скачивание файла однократное?
Купи книжку уровня "TCP для чайников" и прочитай.

P.S. Сама потребность отслеживать это означает, что бизнес-процесс спроектирован непрофессионально.
 

dmitrybelyakov

Новичок
Originally posted by Crazy
Купи книжку уровня "TCP для чайников" и прочитай.

P.S. Сама потребность отслеживать это означает, что бизнес-процесс спроектирован непрофессионально.
Хорошо, в таком случае предлагаю перейти к более теоретическому обсуждению процесса.

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

1. Человек мог скачать файл не видя реального пути к файлу на сервере. По ссылке типа скрипт?id заказа

2. Поддерживалась возмоность возобновить скачивание файлов.

3. После скачивания ссылка убивалась/уходила в архив (по какому признаку?)
 

fixxxer

К.О.
Партнер клуба
Все юзеры понятное дело регаются ($user_id), соответственно при заказе файла генерим $random_id=md5(microtime()) и пишем в табличку downloads - $user_id,$random_id,$filename,$req_time, после чего до наступления момента $req_time+ALLOWED_TIME_PERIOD отдаем при запросе download?id=$random_id файл $filename. то есть юзер имеет возможность скачивать файл в течение ALLOWED_TIME_PERIOD времени, значение которого - на твое усмотрение.

еще вопросы?
 

Crazy

Developer
Т.е. меняем кривую бизнес-задачу на несколько более прямую: человек покупает временнОе окно для скачиания файла.

Обращаю внимание: при этом мы не можем требовать, чтобы файл был скачан одним человеком и один раз.
 

dmitrybelyakov

Новичок
Originally posted by fixxxer
Все юзеры понятное дело регаются ($user_id), соответственно при заказе файла генерим $random_id=md5(microtime()) и пишем в табличку downloads - $user_id,$random_id,$filename,$req_time, после чего до наступления момента $req_time+ALLOWED_TIME_PERIOD отдаем при запросе download?id=$random_id файл $filename. то есть юзер имеет возможность скачивать файл в течение ALLOWED_TIME_PERIOD времени, значение которого - на твое усмотрение.

еще вопросы?
ок, спасибо. приблизительно так у меня и вырисовывается функциональность.

-~{}~ 06.09.04 09:06:

Originally posted by Crazy
Т.е. меняем кривую бизнес-задачу на несколько более прямую: человек покупает временнОе окно для скачиания файла.

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

nightik

PHP5 BetaTeam
Не могу понять: если человек ЗАПЛАТИЛ за файл, то почему от него НАДО "прятать" (по истечении времени или по другому событию) ссылку?

ИМХО, если я заплатил уже за файл, то можно его скачивать сколько угодно раз.

Ситуация: купил на работе, скачал дома (на работе трафик не резиновый)
 

dmitrybelyakov

Новичок
Originally posted by nightik
Не могу понять: если человек ЗАПЛАТИЛ за файл, то почему от него НАДО "прятать" (по истечении времени или по другому событию) ссылку?

ИМХО, если я заплатил уже за файл, то можно его скачивать сколько угодно раз.

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

Crazy

Developer
Автор оригинала: nightik
Не могу понять: если человек ЗАПЛАТИЛ за файл, то почему от него НАДО "прятать" (по истечении времени или по другому событию) ссылку?
Ты не осознаешь смысла своих слов. Если ты купил файл -- он твой. Но это вовсе не означает, что тебе его дадут.

Если ты купил право взять файл -- это еще не значит, что он твой.

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

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

Почувствуй разницу.
 

dmitrybelyakov

Новичок
Originally posted by Crazy
Ты не осознаешь смысла своих слов. Если ты купил файл -- он твой. Но это вовсе не означает, что тебе его дадут.

Если ты купил право взять файл -- это еще не значит, что он твой.

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

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

Почувствуй разницу.
точняк.
 
Сверху