За последние 24 часа нас посетили 55495 программистов и 1617 роботов. Сейчас ищут 1282 программиста ...

Скачка фаилов через скрипт

Тема в разделе "Прочие вопросы по PHP", создана пользователем Psih, 2 авг 2007.

  1. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Народ, выручайте, не могу догнать в чём прикол.
    PHP:
    1. <?php
    2. require_once("include/bittorrent.php");
    3. dbconn();
    4. loggedinorreturn();
    5.  
    6. $filename = preg_split("/\//", ((isset($_SERVER['ORIG_PATH_INFO'])) ? $_SERVER['ORIG_PATH_INFO'] : $_SERVER['PATH_INFO']));
    7.  
    8. $id = array_reverse($filename);
    9. $id = $id[0];
    10.  
    11. if (!$id){
    12.     httperr();
    13. }
    14. $res = mysql_query('SELECT id, name, video_link AS link FROM trailers WHERE id='.$id.' ') or sqlerr(__FILE__, __LINE__);
    15. $row = mysql_fetch_assoc($res);
    16.  
    17. if (!$row || !file_exists("/home/file/www/trailers/trailers/".$row['link']) || !is_readable("/home/file/www/trailers/trailers/".$row['link'])){
    18.     echo 'File is temporary unavaliable!';
    19.     exit;
    20.     httperr();
    21. }
    22.  
    23. $i = strrpos($row['link'], ".");
    24. if ($i !== false) {
    25.     $ext = strtolower(substr($row['link'], $i));
    26. } else {
    27.     echo 'File is temporary unavaliable!';
    28.     exit;
    29.     httperr();
    30. }
    31. switch ($ext) {
    32.     case ".mov":
    33.         $content_type = "video/quicktime";
    34.     break;
    35.  
    36.     case ".avi":
    37.         $content_type = "video/x-msvideo";
    38.     break;
    39.     case ".mpeg":
    40.     case ".mpg":
    41.     case ".mpe":
    42.         $content_type = "video/mpeg";
    43.     break;
    44.  
    45.     default:
    46.         $content_type = "application/octet-stream";
    47.         break;
    48. }
    49. $name = str_replace(" ", "", $row['name'].$ext);
    50. $name = str_replace("/", "-", $name);
    51. $length = filesize("/home/file/www/trailers/trailers/".$row['link']);
    52.  
    53. header('Pragma: public');
    54. header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
    55. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    56. header('Cache-Control: public');
    57. header('Content-Description: File Transfer');
    58. header('Content-Type: '.$content_type);
    59. header('Content-Length: '.$length);
    60. header('Content-Disposition: attachment; filename="'.$name.'"');
    61.  
    62. /*
    63. header("Pragma: public");
    64. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    65. header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    66. header("Cache-Control: public");
    67. header("Content-Description: File Transfer");
    68.  
    69. header('Content-Type: '.$content_type);
    70. header('Content-Disposition: attachment; filename="'.$name.'";');
    71. header("Content-Transfer-Encoding: binary\n");
    72. header('Content-Length: '.$length);
    73. header('Accept-Ranges: bytes');*/
    74. readfile('/home/file/www/trailers/trailers/'.$row['link'].'');
    75. exit();
    76. ?>
    В IE не показываеться прогресс бар сколько скачано - только downloaded xxx so far. В FireFox всё нормально - показывает сколько общий объём и сколько осталось скачать.

    Вторая пролема в том, что скачанное получаеться битым. Там видео фаилы. Плеер их не открывает Если скачать напрямую - всё ОК. Так что проблема где в скрипте, только в чём она - не понимаю.

    Стоит:
    Код (Text):
    1. WEB ~ # uname -a
    2. Linux WEB 2.6.20-gentoo-r8 #1 SMP Sat Jun 30 00:57:09 EEST 2007 x86_64 Intel(R) Core(TM)2 CPU 6600 @ 2.40GHz GenuineIntel GNU/Linux
    3. WEB ~ # lighttpd -v
    4. lighttpd-1.4.13 (ssl) - a light and fast webserver
    5. Build-Date: Jul 31 2007 23:54:41
    6. WEB ~ # php -v
    7. PHP 5.2.2-pl1-gentoo (cli) (built: Jul 13 2007 20:17:52)
    8. Copyright (c) 1997-2007 The PHP Group
    9. Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
    10.     with XCache v1.2.1, Copyright (c) 2005-2007, by mOo
    11. WEB ~ #
     
  2. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Компрессия вывода случаем нигде не включена?
     
  3. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Насчёт второй проблемы. Уже один раз кто-то столкнулся с этой проблемой, но никто не помог http://php.ru/forum/viewtopic.php?t=6717 может хоть сейчас разберёмся.
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Dagdamor
    Sergey89
    По второй проблеме - оказалось плеер отказывался играть потому, что в названии была кирилица. Rename помог.
    По первой - врублена. Если отрубаем само собой всё ОК становиться. Значит если я хочу что бы у меня качалось с прогресс баром то нужно отрубать компрессию?
     
  5. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Psih
    Отрубать не обязательно, но надо понимать, что длина сжатого файла отличается от длины исходного, поэтому заголовок "header('Content-Length: '.$length);" посылает клиенту ерунду. Как именно включается компрессия в скрипте, каким образом?