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 );
}
{
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');
}
}
{
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]
Это всего лишь заголовки.
Если позволяется докачка, значит клиент может прислать соответствующие заголовки в запросе (не помню какие) — дескать, дайте мне такую-то часть файла, начиная с такого то байта. Вы должны их обработать и выдать нужную часть. Вы же каждый раз выдаете полный файл.
Если позволяется докачка, значит клиент может прислать соответствующие заголовки в запросе (не помню какие) — дескать, дайте мне такую-то часть файла, начиная с такого то байта. Вы должны их обработать и выдать нужную часть. Вы же каждый раз выдаете полный файл.
(не помню какие) — а если поднатужиться

Спустя 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);
$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);
_____________