{{notification.text}}

MirGames

05.12.08 03:27
0
Нужен скрипт кол-ва закачек файла с сайта, типа того что у ДРОНАа на сайте стоит. Буквально для одного файла... Оч надо...
#1
05.12.08 18:48
0
А погуглить? : Said: А бан получить? :

Лан глянь тут www.woweb.ucoz.ru , там такое должно быть...
Отредактировано: 05.12.08 19:30
#2
Один из первых
05.12.08 19:20
0
download.php:
Код

<?php
If (!empty($file))
   {
$f=fopen($file.".stat.dat","a+");
flock($f,LOCK_EX);
$count=fread($f,100);
@$count++;
ftruncate($f,0);
fwrite($f,$count);
fflush($f);
flock($f,LOCK_UN);
fclose($f);
    Header("Location:".$file);
   }
?>


вызывается - <a href=download.php?file=xxx.zip>скачать</a>
статистика будет в файле xxx.zip.stat.dat

Ну и подобным образом можно выводить статистику.
Сама функция:
Код
<?php
function showcount($file)
{
If (!empty($file))
   {
$f=fopen($file.".stat.dat","a+");
flock($f,LOCK_EX);
$count=fread($f,100);
flock($f,LOCK_UN);
fclose($f);
if (empty($count)) {$count=0;}
    echo " ($count)";
   }
}
?>


Получается типа:
<a href=download.php?file=xxx.zip>скачать</a> количество скачек:<? showcount("xxx.zip"); ?>
Отредактировано: 05.12.08 19:28
#3
06.12.08 01:37
0
тоже самое, но более человечно:
Код
function work_with_file($file, $string, $open){
    if($open_file=fopen($file, $open)){
        flock($open_file, LOCK_EX);
        fwrite($open_file, $string);
        flock($open_file, LOCK_UN);
        fclose($open_file);
        return true;
    }else{
        return false;
    }
}

function read_file($file, $sign){
    if(is_file($file)){
        $string=file($file);
        $string=$string[0];
    }else{
        $string=$sign;
        work_with_file($file, $sign, "w+");
    }
    return $string;
}

function normalize($a) {
    return preg_replace('/[^a-zA-Z0-9_\.-]/', '', $a);
}

    If(isset($_GET['file']) && trim($_GET['file'])!==""){

        $local="./files";
        $filenamelow=strtolower(normalize($_GET['file']));

        if(is_file($local."/".$filenamelow)){
            $count=read_file($local."/".$filenamelow.".txt", "0");
            $count++;
            work_with_file($local."/".$filenamelow.".dat", $count, "w+");
            $size=filesize($local."/".$filenamelow);

            header("Content-Type: application/force-download; name=".$filenamelow);
            header("Content-Transfer-Encoding: binary");
            header("Content-Length: ".$size);
            header("Content-Disposition: attachment; filename=".$filenamelow);
            header("Expires: 0");
            header("Cache-Control: no-cache, must-revalidate");
            header("Pragma: no-cache");
            readfile($local."/".$filenamelow);

        }

    }

Как минус - нет докачки, а так же для некоторых браузеров потребуется привести имя в нужной кодировке (чтобы при нажатии "сохранить как" брайзер не пытался сохранить "index.php").
#4
06.12.08 02:02
0
Еще более человечным было бы добавление кукисов и лог по IP... Иначе объективности у счетчика не будет благодаря народным умельцам. :)
#5
06.12.08 02:04
0
он же простой просил :)

ADD А вообще счетчик будет показывать именно все закачки, любой запрос к файлу, ведь readfile() читает файл полностью...
Отредактировано: 06.12.08 02:05
#6
06.12.08 15:34
0
Цитата(antonn @ Вчера, 23:37)
[snapback]90252[/snapback]
Как минус - нет докачки

Это как раз бесчеловечно :) Вариант с перенаправлением мне как юзеру нравится больше.
#7
07.12.08 02:25
0
я на вскидку не напишу htaccess, а перенаправлять юзера путем header() или скриптом/мета - это дырка в подсчетах, голую ссылку все увидят :)
#8
07.12.08 06:06
0
antonn
И что с того? Тебе нужно предоставить пользователю файл или как можно больше проблем, чтоб он за премиум аккаунт заплатил? У SourceForge тоже достаточно просто прямую ссылку выяснить, но я это делаю тока когда мне надо запихать сразу десяток линков одного проекта в флешгет (по ссылке на счетчик он неадекватно качает).
#9
07.12.08 16:22
0
Цитата
Тебе нужно предоставить пользователю файл или как можно больше проблем, чтоб он за премиум аккаунт заплатил?

че? по моему мы говорим сейчас о подсчете скачиваемости файла, а не о каких там ограничениях (возможно к этому подвело упоминание htaccess, но апач вообще много чего может, не обязательно ограничивать. например по "прямой" (когда в браузере она действительно "прямая") ссылке на файл он вызовет скрипт счетчика и отдаст файл, для пользователя это ни разу не ограничение, он даже не узнает о всех этих махинациях).
#10
07.12.08 16:42
0
Я про отсутствие докачки - вполне себе ограничение, и на не самых быстрых каналах (в том числе безлимитных) очень раздражающее. Собсно, до сентября этого года я зачастую не мог даже метровый файл скачать без докачки.
Хотя конечно можно написать и скрипт который поддерживает докачку, только это почему-то всем лень.
#11
PHP юзер
07.12.08 16:47
0
Код

function output_file($file,$name)
{
//do something on download abort/finish
//register_shutdown_function( 'function_name'  );
if(!file_exists($file))
die('файл не найден!');
$size = filesize($file);
$name = rawurldecode($name);
  
if (ereg('Opera(/| )([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT']))
$UserBrowser = "Opera";
elseif (ereg('MSIE ([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT']))
$UserBrowser = "IE";
else
$UserBrowser = '';
  
/// important for download im most browser
$mime_type = ($UserBrowser == 'IE' || $UserBrowser == 'Opera') ?
  'application/octetstream' : 'application/octet-stream';
@ob_end_clean(); /// decrease cpu usage extreme
header('Content-Type: ' . $mime_type);
header('Content-Disposition: attachment; filename="'.$name.'"');
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header('Accept-Ranges: bytes');
header("Cache-control: private");
header('Pragma: private');
  
/////  multipart-download and resume-download
if(isset($_SERVER['HTTP_RANGE']))
{
list($a, $range) = explode("=",$_SERVER['HTTP_RANGE']);
str_replace($range, "-", $range);
$size2 = $size-1;
$new_length = $size-$range;
header("HTTP/1.1 206 Partial Content");
header("Content-Length: $new_length");
header("Content-Range: bytes $range$size2/$size");
}
else
{
$size2=$size-1;
header("Content-Length: ".$size);
}
$chunksize = 1*(1024*1024);
$bytes_send = 0;
if ($file = fopen($file, 'r'))
{
if(isset($_SERVER['HTTP_RANGE']))
fseek($file, $range);
while(!feof($file) and (connection_status()==0))
{
$buffer = fread($file, $chunksize);
print($buffer);//echo($buffer); // is also possible
flush();
$bytes_send += strlen($buffer);
//sleep(1);//// decrease download speed
}
fclose($file);
}
else
die('Нет доступа к файлу');
if(isset($new_length))
$size = $new_length;
die();
}

вот, с докачкой :) $file - путь до файла, $name - имя для браузера
#12
07.12.08 16:55
0
Оказывается Deposit сам подсчитывает количество скачек... :D
#13
07.12.08 20:26
0
для отдачи файла с докачкой юзаю class.httpdownload.php.
минус этого способа - пхп занят отдачей файла, в случае с htaccess файл отдает сам апач.
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}