За последние 24 часа нас посетили 62939 программистов и 1743 робота. Сейчас ищут 859 программистов ...

Запрет докачки

Тема в разделе "Прочие вопросы по PHP", создана пользователем Mr.M.I.T., 4 июл 2008.

  1. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    есть такой класс
    Параметр $resume вкл выкл докачку
    Так вот если он выкл, то опера не докачивает, а вот ФФ начинает докачивать как ни в чём не бывало...пАчиму? =)
    PHP:
    1. <?
    2.  
    3. class download{
    4.  
    5.     var $properties = array(    'old_name' => "",
    6.                                 'new_name' => "",
    7.                                 'type' => "",
    8.                                 'size' => "",
    9.                                 'resume' => "",
    10.                                 'max_speed' => ""
    11.                                 );
    12.  
    13.     var $range = 0;
    14.  
    15.     function cnf_download($path, $name="", $resume=0, $max_speed=0){
    16.  
    17.         $name = ($name == "") ? substr(strrchr("/".$path,"/"),1) : $name;
    18.  
    19.         $file_size = @filesize($path);
    20.  
    21.         $this->properties =  array(
    22.                                     'old_name' => $path,
    23.                                     'new_name' => $name,
    24.                                     'type'=> "application/force-download",
    25.                                     'size' => $file_size,
    26.                                     'resume' => $resume,
    27.                                     'max_speed' => $max_speed
    28.                                     );
    29.  
    30.             if ($this->properties['resume']) {
    31.  
    32.                 if(isset($_SERVER['HTTP_RANGE'])) {
    33.  
    34.                     $this->range = $_SERVER['HTTP_RANGE'];
    35.                     $this->range = str_replace("bytes=", "", $this->range);
    36.                     $this->range = str_replace("-", "", $this->range);
    37.  
    38.                 } else {
    39.  
    40.                         $this->range = 0;
    41.  
    42.                 }
    43.  
    44.                 if ($this->range > $this->properties['size']) $this->range = 0;
    45.  
    46.             } else {
    47.  
    48.                 $this->range = 0;
    49.  
    50.             }
    51.  
    52.     }
    53.  
    54.  
    55.     function download_file(){
    56.  
    57.                 if ($this->range) {
    58.                     header($_SERVER['SERVER_PROTOCOL']." 206 Partial Content");
    59.                 } else {
    60.                     header($_SERVER['SERVER_PROTOCOL']." 200 OK");
    61.                 }
    62.             header("Pragma: public");
    63.             header("Expires: 0");
    64.             header("Cache-Control:");
    65.             header("Cache-Control: public");
    66.             header("Content-Description: File Transfer");
    67.             header("Content-Type: ".$this->properties["type"]);
    68.             header('Content-Disposition: attachment; filename="'.$this->properties["new_name"].'";');
    69.             header("Content-Transfer-Encoding: binary");
    70.  
    71.             if ($this->properties['resume']) header("Accept-Ranges: bytes");
    72.  
    73.             if ($this->range) {
    74.  
    75.             header("Content-Range: bytes {$this->range}-".($this->properties['size']-1)."/".$this->properties['size']);
    76.             header("Content-Length: ".($this->properties['size']-$this->range));
    77.  
    78.  
    79.             } else {
    80.  
    81.             header("Content-Length: ".$this->properties['size']);
    82.  
    83.             }
    84.  
    85.             @ini_set('max_execution_time', 0);
    86.             @set_time_limit();
    87.             $this->_download($this->properties["old_name"], $this->range);
    88.     }
    89.  
    90.     function _download ($filename, $range=0)
    91.     {
    92.         @ob_end_clean();
    93.  
    94.         if (($speed = $this->properties['max_speed']) > 0)
    95.             $sleep_time = (8 / $speed) * 1e6;
    96.         else
    97.             $sleep_time = 0;
    98.  
    99.         $handle = fopen($filename, 'rb');
    100.         fseek($handle,$range);
    101.  
    102.         if ($handle === false)
    103.         {
    104.             return false;
    105.         }
    106.  
    107.         while (!feof($handle))
    108.         {
    109.             print (fread($handle, 1024*8));
    110.             ob_flush();
    111.             flush();
    112.             usleep($sleep_time);
    113.         }
    114.  
    115.         fclose($handle);
    116.  
    117.         return true;
    118.     }
    119.  
    120. }
    121.  
    122. ?>
     
  2. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
  3. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    вроде все так и ренж не расчитывается если запрет на докачку стоит и значит выдает указатель - что качать с 0 ...

    (если ты конечно сам не напутал и заставляешь скрипт перебирать cnf_download при каждом обращение к файлу, а не пытаешься запомнить значения в сессии)

    но вот когда сам делал скрипт докачки .. то обратил внимание что фаерфокс лукавит и когда говорит что типа закачка остановлена - соединение на самом деле не ревет, просто ставит сокет в какуюто задержку .. и когда говоришь восстановить передачу, то просто продолжает принимать данные ... а на самом деле обрыва-то небыло! была пауза ....

    и вот тебе вопрос - а ты проверял он точно рвет соединение, а потом восстанавливает и продолжает докачивать ??
     
  4. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ээ а зачем их запоминать в сессии =)
    а как проверить рвёт ли он соединение? :oops:
     
  5. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    есть фаервол - "Аутпост"... очень помогает при работе с сетью .. посмотреть какая прога с чем держит соединения и т.д.
    но можно эмпирически вычислить через netstat
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ээ
    я вот так сделал =) не знаю правельно или нет
    Вставил в download.php такую строчку
    PHP:
    1. $fp=fopen("log.txt","a+");
    2.            fputs($fp,"start\r\n");
    3.            fclose($fp);
    потом несколько раз первал и востановил загрузку
    записало только один start..
    значит не рвёт?
     
  7. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    угу ... судя по всему нет
     
  8. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ну Лиса хулиганка =))