2. давать не прямую ссылку на файл, а на некий php скрипт, которому будет передан параметр, указывающий какой файл нужно показать, а далее этот скрипт пишет куда-то (в базу например) +1 к просмотрам, и делает редирект на требуемый файл. (Или отдает содержимое файла, что на мой взгляд не хорошо)
<?
set_time_limit(0);
# проверяем, передан ли ID файла. Если не передан - показываем .что файл не найден
if (isset($_GET['id'])) {
require ('sh/init.php');
# подключаемся в БД
$new=mysql_query("SELECT link from modx_file where id='$_GET[id]'");
# вытаскиваем из БД ссылку на реальный файл
$row = mysql_fetch_array($new);
$file=$row['link'];
$path="/var/web/j/htdocs/res/"; # путь к директории на сервере, где лежат файлы
$size = @filesize($path.$file); # определяем размер файла
# скачивание файла с докачкой при разрыве
$ff = fopen($path.$file, 'rb');
if(!$ff){header ("HTTP/1.0 505 Internal server error");// Файл почему-то не открывается
exit();}
else{
$range=0;
if (isset($_SERVER["HTTP_RANGE"])) {
$range = $_SERVER["HTTP_RANGE"];
$range = str_replace("bytes=", "", $range);
$range = str_replace("-", "", $range);
if (strlen($range)>0) {
header("HTTP/1.1 206 Partial Content");
fseek($ff, intval($range),0); //сместим указатель в файле
} else {
/// если клиент не запросил докачку
header("HTTP/1.1 200 OK");
}
}
header("Content-Type: application/octet-stream");
header("Content-Type: \"".$mime."\"");
header("Content-Description: file transfer");
header("content-disposition: attachment; filename=\"".$file."\"");
header("Accept-Ranges: bytes");
header("Content-Length: ".($size-$range));
header("Content-Range: $range-".($size -1)."/".$size);
while(!feof($ff)) {
print(fread($ff, 1048*8));
flush();
if (connection_status()!=0) {
@fclose($ff);
die();
}
}
}
@fclose($ff);
# добавляем в БД запись о скачивании
$now=strtotime("now"); $date_time=@date('Y-m-d H:m:s', $now);
$new4=@mysql_query("UPDATE prod SET downs=downs+1 WHERE id='$_GET[id]'");
else{echo "no file";}}
#exit();
?>