Предлагаю решение для даунлоада файлов с докачкой
Фанат, раскритикуйте пожалуйста. У Вас отлично это получается 
PHP:
<?
// download.class.php
// Класс для даунлоада файла с докачкой
// -----------------------------------------------------
class DownLoadFile{
var $FileName; // имя файла
var $size; // размер
var $time; // дата-время модификации
var $start; // с какого байта отдавать
var $NeedRange; // Признак докачки у клиента
function DownLoadFile($FileName){ // конструктор
$this->FileName=$FileName;
$range = getenv("HTTP_RANGE");
if(!Empty($range)){
$this->NeedRange=true;
$this->start=intval(substr($range,6)); //откусили bytes
}else{
$this->NeedRange=false;
$this->start=0;
}
$this->size=-1; // -1 признак что файла нет
if(file_exists($this->FileName)){
$this->size=filesize($this->FileName);
$this->time=date("D, d M Y H:i:s ", filemtime($this->FileName))."GMT";
}
}// конструктор
// private
function outHeaderCommon(){
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment; filename=$this->FileName");
header("Last-modified: ".$this->time);
header("Content-Length: " . ($this->size - $this->start));
}
function outHeaderForRange(){
global $HTTP_SERVER_VARS;
header("Accept-Ranges: bytes");
header($HTTP_SERVER_VARS["SERVER_PROTOCOL"] . " 206 Partial Content");
header("Content-Range: bytes ".$this->start."-".($this->size-1)."/".$this->size);
}
function outContent(){
if($handle = fopen($this->FileName, "rb")){
$this->CalcStatistics();
fseek($handle, $this->start);
fpassthru($handle);
fclose($handle);
}else{
$this->out403();
}
}
// overload
function CalcStatistics(){
// Сохранение в логах факта скачивания файла
// Запись в бд или в текстовый файл по вкусу
// перегрузить в производном классе
}
function outContentType(){
header("Content-Type: application/force-download"); //заставляет всегда сохранять файл
}
function out404(){
header("HTTP/1.0 404 Not Found"); // имхо достаточно
/*
header($HTTP_SERVER_VARS["SERVER_PROTOCOL"] . " 404 Not Found"); // для эстетов
*/
echo "404 Not Found!";
exit;
}
function out403(){
header("HTTP/1.0 403 Forbidden"); // теже замечания, что и для 404
echo "403 Forbidden!";
exit;
}
// public
function out(){
if($this->size>0){
$this->outHeaderCommon();
$this->outContentType();
if($this->NeedRange)$this->outHeaderForRange();
$this->outContent();
}else{
$this->out404();
}
}
}//DownLoadFile
/* Example */
/*
$x = new DownLoadFile('20050726.rar');
$x -> out();
*/
?>
