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

Discussion in 'PHP' started by Dencity, 24 Mar 2008.

  1. Dencity

    Dencity Elder - Старейшина

    Joined:
    28 Feb 2008
    Messages:
    14
    Likes Received:
    8
    Reputations:
    0
    Привет всем...Подскажите плыз как дать добро на закачку файла с Http сервера определенному юзеру...тоесть просто с сайта.Помните скачку с сайтов мп3 ,так там если не зареган, то скрипт те файл не даст скачать...как такое реализовать?Знаю что вродь решается это путем отправки определенных заголовков,но ненаю каких...Подскажите где почитать или так скажите...
     
  2. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,194
    Reputations:
    252
    Вопрос задан некорректно...
    Перед скачкой сделать проверку на регу + если у ссылок прямые ссылки, то сделать их не прямыми с хешем и шифровкой Ip...
     
  3. gibson

    gibson Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    391
    Likes Received:
    247
    Reputations:
    88
    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/ контролируемая отдача файлов