Download с поддержкой закачки

dak

Guest
Download с поддержкой докачки

Имеется скриптик для закачки файла с поддержкой докачки. Если в одни поток и не прерывая то все ок:
А если пытаться "Качалками" пользоваться, то или клиент показывает, что докачки нет, или закачивает с ошибками. Точно понять что работает что нет не получается, у пользователей очень разные сообщения по этому поводу. Вот код, вроде не большой, не глянет кто-нибудь, или не порекомендует где еще можно про это глянуть:

PHP:
function Download($file,$name){
  if (!file_exists($file))
    {
     header ("HTTP/1.0 404 Not Found");
     exit;
    }
  $fsize = filesize($file);
  $ftime = date("D, d M Y H:i:s T", filemtime($file));
  $fd = @fopen($file, "rb");
  if (!$fd){
    header ("HTTP/1.0 403 Forbidden");
    exit;
  }
  // Если запрашивающий агент поддерживает докачку
  if ($HTTP_SERVER_VARS["HTTP_RANGE"]) {
    $range = $HTTP_SERVER_VARS["HTTP_RANGE"];
    $range = str_replace("bytes=", "", $range);
    $range = str_replace("-", "", $range);
    if ($range) {fseek($fd, $range);}
  }
  $content = fread($fd, filesize($file));
  fclose($fd);
  if ($range) {
    header("HTTP/1.1 206 Partial Content");
  }
  else {
    header("HTTP/1.1 200 OK");
  }
  header("Content-Disposition: attachment; filename=".$name);
  header("Last-Modified: $ftime");
  header("Accept-Ranges: bytes");
  header("Content-Length: ".($fsize-$range));
  header("Content-Range: bytes $range-".($fsize -1)."/".$fsize);
  header("Content-Type: application/downloads");
  print $content;
};
Может чего в заголовке забыл послать?
 

kdk

TeaM PHPClub
Re: Download с поддержкой докачки

Автор оригинала: dak
PHP:
  header("Content-Range: bytes $range-".($fsize -1)."/".$fsize);
http://apl.nsk.su/~vlad/http-1.1-rfc2616/rfc2616-sec14.html#sec14.16
Examples of byte-content-range-spec values, assuming that the entity contains a total of 1234 bytes:

. The first 500 bytes:
bytes 0-499/1234

. The second 500 bytes:
bytes 500-999/1234

. All except for the first 500 bytes:
bytes 500-1233/1234

. The last 500 bytes:
bytes 734-1233/1234

Что то там по-моему напутано с интервалами...
Второй параметр это конец интервала, а у тебя вся длина - 1
 

kdk

TeaM PHPClub
Вот еще наткнулся на такую реализацию, работает или нет не знаю...

PHP:
header("HTTP/1.1 206 Partial Content"); 
header("Accept-Ranges:bytes"); 
header("Content-Length:".$contLen); 
header("Content-Range:bytes ".$fileOffset."-".($contLen+$fileOffset-1)."/".($filSize)); 
header("Connection:close"); 
header("Content-Type:application/octet-stream");
 

Yurik

/dev/null
Есть одно скромное мнение:
попробуйте теми же "качалками" закачать в несколько подходов статический файл по ХТТП (не ФТП). Возможно проблема в клиентской части? Подозрения есть потому что, для примера, в mod_deflate рекомендуется выставлять
DeflateDisableRange "MSIE 4."
т.к. IE4 глючит для Accept-Ranges

Ещё примером есть этот форум, не знаю по какой причине (мой прокси, этот сервер или mod_gzip) но иногда та же страница при рефреше выводится битой (IE5 и IE6)

Ещё проблемой могут быть прокси сервера.
 

Iron

Guest
Yurik
Не иногда, а всегда! Очень раздрожает! На до чето с этим делать!
 

Yurik

/dev/null
>На до чето с этим делать
я пока точно не знаю причины данного явления, но имхо
DeflateDisableRange On (или аналогичная директива)
должна решить проблему
 
Сверху