 |
Дать добро на закачку файла(php)...? |

25.03.2008, 00:25
|
|
Познающий
Регистрация: 28.02.2008
Сообщений: 49
С нами:
9579282
Репутация:
22
|
|
Дать добро на закачку файла(php)...?
Привет всем...Подскажите плыз как дать добро на закачку файла с Http сервера определенному юзеру...тоесть просто с сайта.Помните скачку с сайтов мп3 ,так там если не зареган, то скрипт те файл не даст скачать...как такое реализовать?Знаю что вродь решается это путем отправки определенных заголовков,но ненаю каких...Подскажите где почитать или так скажите...
|
|
|

25.03.2008, 02:31
|
|
Флудер
Регистрация: 20.11.2006
Сообщений: 3,315
С нами:
10248806
Репутация:
2371
|
|
Вопрос задан некорректно...
Перед скачкой сделать проверку на регу + если у ссылок прямые ссылки, то сделать их не прямыми с хешем и шифровкой Ip...
|
|
|

25.03.2008, 02:48
|
|
Постоянный
Регистрация: 24.02.2006
Сообщений: 447
С нами:
10636106
Репутация:
705
|
|
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/ контролируемая отдача файлов
|
|
|
|
 |
Предыдущая тема
Следующая тема
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|