Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Скачка mp3 файлов с сервера.


Автор: Mystery 29.5.2006, 15:14
Есть музыкальный сайт.

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

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

Thnk U 

Автор: Mal Hack 29.5.2006, 15:31
http://forum.vingrad.ru/index.php?showtopic=71402&view=getnewpost 

Автор: Mystery 29.5.2006, 15:48
Цитата

Мы в таблицу сессий заносим какой-ть любой идентификатор аля md5, время через которое он умрет и ID файла.

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

Автор: Mal Hack 29.5.2006, 16:18
100% идеального решения тут не будет. В принципе можно отследить по потокам, но как это делать я не знаю. И ваять тут уже надо с http сервером. 

Автор: patt 11.6.2006, 14:14
На проффессиональных интернет магазинах делаеться так: создаёться уникальная ссылка со сроком жизни пару дней, длинна уникальной части ссылки 15-20 символов, тоесть подобрать её невозможно.

Сам кагда то интересовался как определить скачался ли файл полностью, ничего не нашёл, если тебе повезёт большае незабудь поделиться  smile  

Автор: -=Ustas=- 13.6.2006, 07:38
Цитата(patt @  11.6.2006,  14:14 Найти цитируемый пост)
Сам кагда то интересовался как определить скачался ли файл полностью

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

Автор: szz 3.7.2006, 20:06
Цитата

На проффессиональных интернет магазинах делаеться так: создаёться уникальная ссылка со сроком жизни пару дней, длинна уникальной части ссылки 15-20 символов, тоесть подобрать её невозможно.

   Да, а толку? В течение 2-х дней можно качать этот файл? Как сделать так, чтоб вообще ни раз скачать нельз было?

Лучше всего - делать это через флеш. Никто ссылку не увидит (ее тайком флеш закачивает) и все довольны. Можно, конечно, ссылку отстрелить если мониторить все входы-выходы по 80 порту, но мало кто такое делать будет.

 

Автор: sergejzr 3.7.2006, 20:26
Я бы написал сервлет с докачкой на пару строк...

Добавлено @ 20:28 
Хотя... можно поэксперементировать с докачкой и на пхп... 

Автор: sergejzr 3.7.2006, 20:43
Вот, собрал ветку отсюда: http://forum.ru-board.com/topic.cgi?forum=31&topic=2045
Код





workFileSize=filesize($file);
if (isset($server["HTTP_RANGE"])) {
 
/*
Смотрим в БД, свежая ли закачка. 
Например если запись в БД существует.
Если нет, то die();
*/
if(!is_in_DB(file)) die();

preg_match ("/bytes=(\d+)-/", $server["HTTP_RANGE"], $m);
$contentSize = $workFileSize - intval($m[1]);
$p1 = $workFileSize-$contentSize;
$p2 = $workFileSize-1;
$p3 = $workFileSize;
$offset=$m[1];
header ("HTTP/1.1 206 Partial Content");
header ("Date: " . getGMTDateTime ());
header ("X-Powered-By: PHP/" . phpversion());
header ("Expires: Thu, 19 Nov 1981 08:52:00 GMT");
header ("Cache-Control: None");
header ("Pragma: no-cache");
header ("Accept-Ranges: bytes");
header ("Content-Disposition: inline; filename=\"" . $workFileName . "\"");
header ("Content-Type: application/octet-stream");
header ("Content-Range: bytes " . $p1 . "-" . $p2 . "/" . $p3);
header ("Content-Length: " . $contentSize);
header ("Proxy-Connection: close");

}else
{
/*
Здесь надо доп. проверить, скачивался ли файл уже хоть раз.
Файл начинает скачиваться.
*/
insert_in_DB($file);
header ("HTTP/1.1 200 OK");
header ("Date: " . getGMTDateTime ());
header ("X-Powered-By: PHP/" . phpversion());
header ("Expires: Thu, 19 Nov 1981 08:52:00 GMT");
header ("Cache-Control: None");
header ("Pragma: no-cache");
header ("Accept-Ranges: bytes");
header ("Content-Disposition: inline; filename=\"" . $workFileName . "\"");
header ("Content-Type: application/octet-stream");
header ("Content-Length: " . $contentSize);
header ("Age: 0");
header ("Proxy-Connection: close");
$offset=0;
}

$fd = fopen ($file, "r");
fseek ($fd, $offset);
$contents = fread ($fd, filesize($file)-$offset); 
print $contents;
/*
Помечаем как скачанный (например убираем из БД)
*/
deleteFromDB($file);

 

Автор: dm9 4.7.2006, 12:40
sergej.z, это всё хорошо... но может быть просто так: я (в Опере) нажимаю на ссылку, она начинает закачку и параллельно (!) предлагает выбрать файл. Выбираю. Промахиваюсь по кнопке "Open", нажимаю "Cancel". И всё — нет файла. А деньги проплачены. Так что эти проверки... лучше просто дать на два дня, и пусть хоть обкачается. Можно по IP ограничивать. Начал качать с одного IP — будь добр с него докачать. Ну или 2-3 IP позволить... на всякий случай. Просто недовольный клиент — это гораздо хуже, чем лишнее незаконное скачивание. ИМХО, конечно.
 

Автор: szz 4.7.2006, 12:42
Говорю вам: Flash fileReferenсe вас спасет. 

Автор: sergejzr 4.7.2006, 13:11
Цитата(dm9 @  4.7.2006,  10:40 Найти цитируемый пост)
sergej.z, это всё хорошо... но может быть просто так: я (в Опере) нажимаю на ссылку, она начинает закачку и параллельно (!) предлагает выбрать файл. Выбираю. Промахиваюсь по кнопке "Open", нажимаю "Cancel". И всё — нет файла. А деньги проплачены. Так что эти проверки... лучше просто дать на два дня, и пусть хоть обкачается. Можно по IP ограничивать. Начал качать с одного IP — будь добр с него докачать. Ну или 2-3 IP позволить... на всякий случай. Просто недовольный клиент — это гораздо хуже, чем лишнее незаконное скачивание. ИМХО, конечно.

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

А вообще, вопрос был "как", а не "зачем".

С тобой полностью согласен насчёт  
Цитата

Просто недовольный клиент — это гораздо хуже, чем лишнее незаконное скачивание. 
 

Автор: -=Ustas=- 4.7.2006, 13:29
Цитата(szz @  4.7.2006,  12:42 Найти цитируемый пост)
Говорю вам: Flash fileReferenсe вас спасет.

Это что такое? 

Автор: Alex13 4.3.2007, 09:25
Сдается мне, если поэксперементировать с этим скриптом, то все можно без особых проблем сделать
http://xpoint.ru/forums/programming/PHP/thread/20714.xhtml

Автор: BuShaRt 30.3.2007, 13:13
szz, 
Цитата

Говорю вам: Flash fileReferenсe вас спасет. 


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

А во вторых, выше написали же.
Цитата

Просто недовольный клиент — это гораздо хуже, чем лишнее незаконное скачивание. 

Автор: CyClon 5.4.2007, 14:11
Цитата
sergej.z, это всё хорошо... но может быть просто так: я (в Опере) нажимаю на ссылку, она начинает закачку и параллельно (!) предлагает выбрать файл. Выбираю. Промахиваюсь по кнопке "Open", нажимаю "Cancel". И всё — нет файла. А деньги проплачены. Так что эти проверки... лучше просто дать на два дня, и пусть хоть обкачается. Можно по IP ограничивать. Начал качать с одного IP — будь добр с него докачать. Ну или 2-3 IP позволить... на всякий случай. Просто недовольный клиент — это гораздо хуже, чем лишнее незаконное скачивание. ИМХО, конечно.


+1, разрешить скачивать файл в течении 24 часов только с трех IP - два из них получаем при выдаче ссылке на закачку (берем от браузера - REMOTE_ADDR и HTTP_X_FORWARDED_FOR), третий - берем скриптом, который выдает файл. То есть разрешить закачку с того IP, который первый запросил файл. Третий IP - на случай, если юзер юзает прозрачный прокси при серфинге, а качает на прямую. Имхо самый хороший вариант.

Автор: coyl 12.4.2007, 11:09
Ограничение по Ip это нехорошо. Хоть эпоха диалапа ушла, но все же. Когда я работал над мп3 магазином - сделал выдачу файла через скрипт с учётом процентов скачки. И тогда 100% скачал - ссылка исчезает. И никаких ограничений по ip не надо. только хеши генери да выдавай ссылки по ним.
Плюс - в корзине клиента есть такая фича как "процент скачки". Мелочь, а приятно.
И ничего с сервером мутить не надо. делается все через php

Докачка конечно тоже должна быть, ибо иначе это уже не тот уровень.

Автор: BuShaRt 16.4.2007, 11:48
CyClon, 
А если IP динамичский?

Автор: CyClon 16.4.2007, 14:17
Цитата
CyClon, 
А если IP динамичский?


Тогда по маске хотя бы.

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