Если у Вас возникла потребность в отдаче (выгрузке) файлов Вашим пользователям, и Вы хотите контролировать кому, с какой скоростью и сколько отдать, предлагаю Вам свой php-класс. Данный класс есть сборная солянка чужого кода под моей редакцией и улучшениями. Копирайты не привожу, т.к. за частую трудно определить, кому именно принадлежало право первенства на тот или иной кусок кода, да и заниматься вычислением авторов специально желания нет. По сему заранее приношу неизвестным авторам извинения за плагиат :). Но меня, как практикующего программиста, интересовал в первую очередь результат. Короче: всем желающим/страждущим, кому не хочется переводить свое время на изобретение велосипеда, предлагаю воспользоваться моим.
Описание
Представленный ниже класс позволяет:
- разрешать/запрещать докачку файлов; - ограничивать скорость отдачи (по умолчанию 5 Кб); - отдавать файлы пользователям по именам, передаваемым в класс (авторизация оных ложится на Ваши плечи - класс только принимает имя пользователя и по нему считает объем).
Для каждого пользователя в папке stats (по умолчанию) заводится своя папка по имени пользователя. Из имени пользователя регэкспом вырезается все кроме "0-9a-za-z_-". Для каждого ip-адреса заводится соответствующий файл (например: 10.1.3.94) в который в течение времени работы скрипта записывается скачанный объем. По этому файлу собственно и осуществляется контроль отдаваемого объема. Удаление/обнуление файла классом не производится - если Вам это нужно - допишите сами. разрешать/запрещать отдачу файлов по списку стран, ip-адресов. Во всех списках разделитель запятая, все знаки (в т.ч. пробелы учитываются!). Локалхост и локальные адреса (192.168.xxx.xxx, 10.xxx.xxx.xxx, 172.16.xxx.xxx) именуются как localhost и local network соответственно. Определение страны по ip-адресу осуществляется через сервис whois.ripe.net.
class cdownload { # ------------------------------------------------------------------------------------- # Описание : выгрузка файла пользователю с поддержкой докачки и ограничением скорости # ------------------------------------------------------------------------------------- var $downloadtimelimit = 300; # Лимит времени работы функции выгрузки var $username = anonymous/; # Пользователь по умолчанию var $sizelimit = 0; # Лимит объема выгрузки (0 - без ограничений) var $speedlimit = 5; # Лимит скорости выгрузки, кб/с var $enablepartial = 1; # Разрешение докачки (0 - запрещена) var $statfolder = stats/; # Папка расположения статистики var $filename; # Выгружаемый файл (должен быть задан!) var $enabledcountry; # Разрешенные страны (список разделенный запятыми, # null - разрешеные все) var $disabledcountry; # Запрещенные страны (список разделенный запятыми) var $whitelist; # Список разрешенных ip-адресов (список разделенный запятыми) var $banlist; # Список запрещенных ip-адресов (список разделенный запятыми)
var $transferbytes = 0;
function cdownload($filename,$username) { $this->filename = $filename; if ($username) $this->username = ereg_replace([^0-9a-za-z_-],,$username)./; $fullpath = $this->statfolder.$this->username; if (!file_exists($fullpath)) mkdir($fullpath); } # end cdownload
function verifycountry() { $usercountry = $this->getcountry($_server[remote_addr]); if ( ($this->enabledcountry && !in_array($usercountry,split(,,$this->enabledcountry))) ($this->disabledcountry && in_array($usercountry,split(,,$this->disabledcountry))) ($this->whitelist && !in_array($_server[remote_addr],split(,,$this->whitelist))) ($this->banlist && in_array($_server[remote_addr],split(,,$this->banlist))) ) { header(http/1.0 403 forbidden); header(warning: 99# you country or ip address disabled); exit; } }
function downloadfile() { $this->verifycountry();
$blocksize = 8192; $headererrortext = error! a possible size is exceeded;