При попытки докачки бьются файлы...

ast-ross

Новичок
При попытки докачки бьются файлы...

Народ, вот нарыл в форуме такую функцию:
PHP:
function download_file($file, $speed_limit, $resume, $send_errors) {
 //return:: 0 - ok \ 1 - $file is_null \ 2 - forbidden \ 3 - 404 Error
 if (is_null($file)) return 1;
 else {
  $file_name=basename($file);
  $speed_limit=intval($speed_limit);
  if ($speed_limit<0) $speed_limit=1024;
  $running_time=0;
  $begin_time=time();
  set_time_limit(300);
  if (file_exists($file)) {
  $file_hand=fopen($file, "rb");
   if ($file_hand!=false) {
    $file_size=filesize($file);
    $file_date=date("D, d M Y H:i:s T", filemtime($file));
    if (preg_match("/bytes=(\d+)-/", @$_SERVER["HTTP_RANGE"], $range) AND $resume==true) {
     header("HTTP/1.1 206 Partial Content");
     $offset=$file_size-intval($range[1]);
     }
    else {
     header("HTTP/1.1 200 OK");
     $offset=0;
     }
    $data_start=$offset;
    $data_end=$file_size-1;
    $etag=md5($file.$file_size.$file_date);
    fseek($file_hand, $data_start);
    header("Content-Disposition: attachment; filename=".$file_name);
    header("Last-Modified: ".$file_date);
    header("ETag: \"".$etag."\"");
    if($resume==true) header("Accept-Ranges: bytes");
    header("Content-Length: ".($file_size-$data_start));
    header("Content-Range: bytes ".$data_start."-".$data_end."/".$file_size);
    header("Content-type: application/octet-stream");
    while(feof($file_hand)==false AND (connection_status()==0)) {
     print fread($file_hand,$speed_limit);
     flush();
     sleep(1);
     $running_time=time()-$begin_time;
     if($running_time>240) {
      set_time_limit(300);
      $begin_time=time();
      }
     }
    fclose ($file_hand);
    return 0;
    }
   else {
    if($send_errors==true) header ("HTTP/1.0 403 Forbidden");
    return 2;
    }
   }
  else {
   if($send_errors==true) header("HTTP/1.0 404 Not Found");
   return 3;
   }
  }
 }
$file - файл
$speed_limit - ограничение по скорости
$resume - докачка
$send_errors - выдовать ошибки.

Все работает. тока вот такая проблема: если тянуть download менеджерем и во время загрузки оборвется связь, докачка пройдет нормально, тока вот файлец придет битый. Если тянуть без пауз, то все тип-топ... Видимо где приходит не пустой HTTP_RANGE, происходит сдвиг может лишние байты записываются, а может наоборот не дописываются. Вобщем я его и так и сяк... а он нифига. Глянте может увидите где ошибка закралась...

-~{}~ 10.03.05 10:49:

Народ! fixer, Фанат... где вы?

-~{}~ 10.03.05 10:50:

Откуда появляются лишние быйты???
 

wit2005

Guest
Очень подозрительно выглядит строка:
$offset=$file_size-intval($range[1]);

есть такое подспудное очучение, что должно быть
$offset=intval($range[1]);
 

ast-ross

Новичок
Автор оригинала: wit2005
Очень подозрительно выглядит строка:
$offset=$file_size-intval($range[1]);

есть такое подспудное очучение, что должно быть
$offset=intval($range[1]);
10х.
Щас потестю, отпишусь...

-~{}~ 11.03.05 15:05:

OOO!!! :D :D :D
Заработала! Респект тебе огромный!!!
 
Сверху