= $last_mod || !$_SERVER['HTTP_IF_RANGE']){ //проверяем, совпадает ли метка объекта с текущей if(!$etag && !$_SERVER['HTTP_IF_MATCH'] && $_SERVER['HTTP_IF_MATCH'] ="*") header("HTTP/1.1 412 Precondition Failed"); else{ //проверяем время модификации if(strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) <= $last_mod) header("HTTP/1.1 304 Not Modified"); else{ //определяем диапазон //то, что лежит в $_SERVER['HTTP_RANGE']: bytes=20-50/длина файла $range=substr($_SERVER['HTTP_RANGE'], strpos($_SERVER['HTTP_RANGE'], '=')+1); $range = substr($range, strpos($range,0,"/")); $range = explode("-", $range); $from = $range[0]; $to = $range[1]; //если первая позиция не задана, берем ее с нуля if($from < 0) $from = 0; if($to) $to = ++ $to; //если не задана позиция конца else $to = $size; //первые байты, диапазон типа 521000- if($range[1]==''){ $from = 0; $to = $range[0]; } //последние байты, диапазон типа -300000 if($range[0]==''){ $from = $range[1]; $to = $size; } } } }//условные запросы }else{ //клиент запросил весь файл $from = 0; $to = $size; } //отправляем заголовки и для целого файла, и для частичной загрузки header('Content-Type: '. $mime); header('Content-Disposition: attachment; filename=' . basename($filename)); header("Last-Modified: " . date("D M Y H:i:s T",$last_mod)); //узнаем, запросил клиент полный файл либо кусок if ($from > 0 || $to < $size) { //первый и последний байт куска $start = $from; $end = $to - 1; header('HTTP/1.1 206 Partial Content'); //метка header("ETag: \"".$etag."\""); //длина диапазона, который считывается $part = $to - $from; header('Content-Length:' . $part); header('Content-Range: bytes ' . $start . "'-'" . $end . "'/'" . $size); }else{ // если клиент не запросил докачку или byte-range-spec некорректна //если метка не соответствует header("HTTP/1.1 200 OK"); header('Content-Length:' . $size); } //ставим указатель на начальную позицию, которую задал клиент fseek($f, $start, SEEK_SET); //выдача файла while(!feof($f)) { if($to == $size){ //выводим остаток до конца файла $f_end = fpassthru($f); echo $f_end; }else{ //выводим начало и середину $read = fread($f, 256000); echo $read; flush(); } } fclose($f); }//while($row = //счетчик скачиваний $sql_update = "UPDATE books SET count_download = count_download + 1 WHERE id =" . $_GET['id_book']; mysql_query($sql_update); }//if(isset($_GET ?>