Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Дать добро на закачку файла(php)...? (https://forum.antichat.xyz/showthread.php?t=65334)

Dencity 25.03.2008 00:25

Дать добро на закачку файла(php)...?
 
Привет всем...Подскажите плыз как дать добро на закачку файла с Http сервера определенному юзеру...тоесть просто с сайта.Помните скачку с сайтов мп3 ,так там если не зареган, то скрипт те файл не даст скачать...как такое реализовать?Знаю что вродь решается это путем отправки определенных заголовков,но ненаю каких...Подскажите где почитать или так скажите...

Isis 25.03.2008 02:31

Вопрос задан некорректно...
Перед скачкой сделать проверку на регу + если у ссылок прямые ссылки, то сделать их не прямыми с хешем и шифровкой Ip...

gibson 25.03.2008 02:48

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/ контролируемая отдача файлов


Время: 21:57