Показать сообщение отдельно

  #3  
Старый 25.03.2008, 02:48
gibson
Постоянный
Регистрация: 24.02.2006
Сообщений: 447
Провел на форуме:
2872049

Репутация: 705
Отправить сообщение для gibson с помощью ICQ
По умолчанию

PHP код:
include 'cdownload.inc.php';

$download = @new cdownload($_request['download']);
$download->enabledcountry 'localhost,local network,ua,ru';
$download->whitelist '127.0.0.1,10.1.3.94';
$download->banlist '184.12.13.5';
$download->username 'pupkin';
$download->speedlimit 10;
$download->sizelimit 2*mb;
$download->downloadfile();

?>

Код класса
# filename: cdownload.inc.php

define('kb',1024);
define('mb',kb*1024);

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';

$this->username = ereg_replace('[^0-9a-za-z_\-]','',$this->username).'/';
$this->filename = preg_replace('/\.{2}/','',$this->filename);

if (!file_exists($this->filename)) {
header('http/1.0 404 not found');
exit;
}
$fsize = filesize($this->filename);
$ftime = date('d, d m y h:i:s t', filemtime($this->filename));
$fd = @fopen($this->filename, 'rb');
if (!$fd) {
header('http/1.0 403 forbidden');
exit;
}

if ($this->enablepartial && ereg('bytes=([0-9]+)-',$_server['http_range'],$range)) {
header('http/1.1 206 partial content');
$range = $range[1];
fseek($fd, $range);
} else 
header('http/1.1 200 ok');

$fullpath = $this->statfolder.$this->username;
$this->transferbytes = file($fullpath.$_server['remote_addr']);
$this->transferbytes = $this->transferbytes[0];


if ($this->sizelimit && $this->transferbytes>$this->sizelimit) {
header('http/1.0 403 forbidden');
header('warning: 99# '.$headererrortext);
exit;
}

$fp = fopen($fullpath.$_server['remote_addr'],'w');

header('content-disposition: attachment; filename='.ereg_replace('^.*/','',$this->filename));
header('last-modified: '.$ftime);
header('accept-ranges: bytes');
header('content-length: '.($fsize-$range));
header('content-range: bytes '.$range.'-'.($fsize-1).'/'.$fsize);
header('content-type: application/octet-stream');
set_time_limit($this->downloadtimelimit);

while (!feof($fd)) {
if ($this->sizelimit && $this->transferbytes>$this->sizelimit) {
header('warning: 99# '.$headererrortext);
exit;
}
echo fread($fd, $blocksize);
$this->transferbytes += $blocksize;
fseek($fp,0);
fwrite($fp,$this->transferbytes);
if ($this->speedlimit)
usleep(8000000/$this->speedlimit);
}
fclose($fp);

fclose($fd);
} # end downloadfile

function getcountry($ip) {
$result = 'unknow';
if (ereg('127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}',$ip))
return 'localhost';
if (ereg('10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|191\.168\.[0-9]{1,3}\.[0-9]{1,3}|'.
'172\.16\.[0-9]{1,3}\.[0-9]{1,3}',$ip))
return 'local network';
if ($ip!='') {
$sock = fsockopen('whois.ripe.net',43,$errno,$errstr);
if ($sock) {
fputs ($sock,$ip."\r\n");
while (!feof($sock) && !preg_match('/country:\s*(\s*)/',$buf,$matches)) 
$buf = fgets($sock,128);
$result = strtoupper($matches[1]);
}
fclose ($sock);
}
return $result;
} # end getcountry
}

?> 
посмотри тут http://articles.org.ru/ контролируемая отдача файлов
 
Ответить с цитированием