We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 26487
    • 13 Posts
    Добрый день, интересует вопрос, как можно собирать статистику по скачиванию файлов.

    Имею несколько разделов, в одном размещены pdf, в другом имею фото галерею на Easy 2 Gallery, в галерее на данный момент шесть альбомов, дальше будет больше. У каждой фотографии есть прямая ссылка на фотографию. Хотелось бы иметь статистику по скачиванию файлов, в не зависимости от типа данных и их месторасположения на сервере.

    Есть ли готовые решения?
      • 1611
      • 591 Posts
      На счет готовых решений я не знаю, но в общем существует два подхода:
      1. анализировать лог-файлы apache и вытаскивать из них данные по загрузке необходимых файлов.
      2. давать не прямую ссылку на файл, а на некий php скрипт, которому будет передан параметр, указывающий какой файл нужно показать, а далее этот скрипт пишет куда-то (в базу например) +1 к просмотрам, и делает редирект на требуемый файл. (Или отдает содержимое файла, что на мой взгляд не хорошо)
        • 26487
        • 13 Posts
        Спасибо за ответ.

        Quote from: Andrey at Apr 14, 2010, 08:17 PM

        2. давать не прямую ссылку на файл, а на некий php скрипт, которому будет передан параметр, указывающий какой файл нужно показать, а далее этот скрипт пишет куда-то (в базу например) +1 к просмотрам, и делает редирект на требуемый файл. (Или отдает содержимое файла, что на мой взгляд не хорошо)

        Тут логика понятна, но хотелось бы иметь нормальную статистику. По сути записать в базу надо имя файла + 1 к счетчику, если файл еще не скачивался то создать новую запись, так же было бы полезно иметь не только имя файла, но путь к нему.

        Возможно кто то делал, что то подобное?
          • 26744
          • 157 Posts
          Вообще-то всё просто.
          У меня это лежит в отдельном файле.

          <?
          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();
          ?>