[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Отдать файл с другого сервера с возможностью докачки
SVFox
Здравствуйте!<br /><br />На голове скоро не будет волос html/emoticons/crying.gif <br /><br />есть скрипт отдачи файлов пользователям, с возможностью докачки:<br /><br />
set_time_limit(0);<br />  $filename = "http://сайт где лежит файл?id=".$_GET['id']."&code=".$_GET['key'];<br /><br />  $info = get_headers($filename,1);<br /><br />  $fsize = $info['Content-Length'];<br />  $realFooFilePath = $filename;               // реальный путь к файлу<br />  header ( 'HTTP/1.1 200 OK', true, 200 );<br />  header ( 'Status: 200 OK' );<br />  header ( 'Pragma: ' );<br />  header ( 'Cache-control: must-revalidate, post-check=0, pre-check=0' );<br />  header ( 'Content-length: ' . $fsize );<br />  header ( 'Last-Modified: ' . $info['Last-Modified']);<br />  header ( 'Content-disposition: '.$info['Content-Disposition'] );<br />  header ( 'Content-type: ' . $info['Content-Type'] );<br />  header ( 'Content-transfer-encoding: binary');<br /><br />if ( isset ( $_SERVER['HTTP_RANGE'] ) )<br />{<br />  if ( eregi ( 'bytes=([0-9]+)-', $_SERVER['HTTP_RANGE'], $range ) && isset ( $range[1] ) )<br />  {<br />    $rangePosition = intval ( $range[1] );<br />    $rangeResponse = $rangePosition . '-' . $fsize - 1;<br />    header ( 'HTTP/1.1 206  Partial content', true , 206);<br />    header ( 'Status: 206 Partial content' );<br />    header ( 'Content-range: bytes ' . $rangeResponse . '/' . $fsize );<br />    header ( 'Last-Modified: ' . $info['Last-Modified']);<br />    header ( 'Content-disposition: '.$info['Content-Disposition'] );<br />  header ( 'Content-type: ' . $info['Content-Type'] );<br />    header ( 'Content-transfer-encoding: binary');<br />  }<br />}<br /><br />$SpeedLimitBlockSize = 1*(1024*1024);                 // желаемая скорость передачи (Кбайт/с)<br />$OK = false;<br />if ( $fp = fopen ( $realFooFilePath, 'rb' ) )   // 'rb' - обязательно для бинарных файлов<br />{<br />  while ( !feof ( $fp ) )<br />  {<br />    $buffer = fread ( $fp, $SpeedLimitBlockSize );<br />    print $buffer;<br />    flush ();<br />    sleep ( 1 );<br />  }<br />  flush ();<br />  $OK = feof ( $fp );<br />  fclose ( $fp );<br />}
<br /><br />все качается на ура когда это IE но как только я пытаюсь скачать файл например FashGet_ом, начинает ерунда,<br />загрузка идет в 5 потоков и вот каждый поток качает не свою положенную часть файла а опять же файл с самого начала, в итоге файл получается сами понимаете какой, если видео то пять раз все сначала html/emoticons/crying.gif <br /><br />Есть ли другой способ загрузки, или например я не смог найти как не дать загрузчику закачивать сразу пять частей.



Спустя 1 час, 43 минуты, 37 секунд (30.08.2007 - 08:53) vasa_c написал(а):
Цитата
if ( $fp = fopen ( $realFooFilePath, 'rb' ) ) // 'rb' - обязательно для бинарных файлов
{
while ( !feof ( $fp ) )
{
$buffer = fread ( $fp, $SpeedLimitBlockSize );
print $buffer;
flush ();
sleep ( 1 );
}
flush ();
$OK = feof ( $fp );
fclose ( $fp );
}

И где здесь реализована докачка? Весь же файл отдаете.

Спустя 30 минут, 22 секунды (30.08.2007 - 09:23) SVFox написал(а):
Цитата
И где здесь реализована докачка? Весь же файл отдаете.


Код
if ( isset ( $_SERVER['HTTP_RANGE'] ) )
{
  if ( eregi ( 'bytes=([0-9]+)-', $_SERVER['HTTP_RANGE'], $range ) && isset ( $range[1] ) )
  {
    $rangePosition = intval ( $range[1] );
    $rangeResponse = $rangePosition . '-' . $fsize - 1;
    header ( 'HTTP/1.1 206  Partial content', true , 206);
    header ( 'Status: 206 Partial content' );
    header ( 'Content-range: bytes ' . $rangeResponse . '/' . $fsize );
    header ( 'Last-Modified: ' . $info['Last-Modified']);
    header ( 'Content-disposition: '.$info['Content-Disposition'] );
  header ( 'Content-type: ' . $info['Content-Type'] );
    header ( 'Content-transfer-encoding: binary');
  }
}


Вот этот код, позволяет докачивать, но мне не это интересно, а другое о чем писал

Спустя 6 минут, 45 секунд (30.08.2007 - 09:30) vasa_c написал(а):
Это всего лишь заголовки.
Если позволяется докачка, значит клиент может прислать соответствующие заголовки в запросе (не помню какие) — дескать, дайте мне такую-то часть файла, начиная с такого то байта. Вы должны их обработать и выдать нужную часть. Вы же каждый раз выдаете полный файл.

Спустя 12 минут, 6 секунд (30.08.2007 - 09:42) SVFox написал(а):
Цитата(vasa_c @ 30.8.2007, 6:30) [snapback]26547[/snapback]
Это всего лишь заголовки.
Если позволяется докачка, значит клиент может прислать соответствующие заголовки в запросе (не помню какие) — дескать, дайте мне такую-то часть файла, начиная с такого то байта. Вы должны их обработать и выдать нужную часть. Вы же каждый раз выдаете полный файл.


(не помню какие) — а если поднатужиться blush.gif и вспомнить, хоть намек, что и как, дальше я сам, просто все, что нахожу однообразно и работает все перкрасно если отдавать с сервака на прямую а вот с другого уже такая ерунда.

Спустя 11 минут, 52 секунды (30.08.2007 - 09:54) vasa_c написал(а):
В мозгах нет мышц, чтобы тужится. Почитайте стандарт HTTP.
Или поставьте на браузер сниффер (в поиск) и попробуйте загрузить файл с докачкой. Посмотрите, каким заголовками обменивается браузер с сервером.
Да или просто в своем сценарии скидывайте полученные заголовки в файл. Запустите флешгет, сценарий запишет полученные заголовки, а вы разберитесь, что там к чему.

Спустя 10 дней, 25 минут, 12 секунд (10.09.2007 - 10:19) SVFox написал(а):
Цитата(vasa_c @ 30.8.2007, 6:54) [snapback]26551[/snapback]
В мозгах нет мышц, чтобы тужится. Почитайте стандарт HTTP.
Или поставьте на браузер сниффер (в поиск) и попробуйте загрузить файл с докачкой. Посмотрите, каким заголовками обменивается браузер с сервером.
Да или просто в своем сценарии скидывайте полученные заголовки в файл. Запустите флешгет, сценарий запишет полученные заголовки, а вы разберитесь, что там к чему.


Ну зато есть мозги ИНОГДА )))

вобщем принцип другой, в первом топике в скрипте ссылка указывает на то что скачивать нужно с другого сайта\сервера. и при этом тот сервер отдает файл с возможностью докачивать.

и пришлось писать не скрипт отдачи файла с докачкой а как бы клиента посредника,
кому может и пригодится: (скрипт работает, но каждый может его улучшить)
Код
   //получаем заголовки с инфой о файле
   $info = get_headers("http://".$filename,1); //файл на другом серваке
   //далее так как скрипт клиент будем использовать cURL
   $ch = curl_init();
   // curl_setopt - необходимые опции
   curl_setopt ($ch, CURLOPT_URL, "http://".$filename);
    //проверяем есть ли запрос на докачку
    $from=$to=0; $cr=NULL;
    if (isset($_SERVER['HTTP_RANGE'])) {$range=substr($_SERVER['HTTP_RANGE'], strpos($_SERVER['HTTP_RANGE'], '=')+1);
    $from=strtok($range, '-');$to=strtok('/');
    if ($to>0) $to++;
    if ($to) $to-=$from;

    header('Accept-Ranges: bytes');
    //передаем и серверу от куда качаем что мы докачиваем
    curl_setopt($ch,CURLOPT_RANGE,$_SERVER['HTTP_RANGE']);
    header('Content-Length: ' . ($info['Content-Length']-($to+$from)));

    }else{

    header('Content-Length: ' . ($info['Content-Length']));
    }
    header('Connection: close');
    header('Content-Type: ' . $info['Content-Type']);
    header('Last-Modified: ' . $info['Last-Modified']);
    header('Content-Disposition: '.$info['Content-Disposition']);
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,0);
    curl_setopt($ch,CURLOPT_HEADER,0);

    // получаем данные
    curl_exec ($ch);

     while (!feof($ch)){
       print fgets($ch, 10000);
     }
   // Отключаемся от сервера.
    curl_close ($ch);




_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.