kornel 0 Опубликовано: 9 февраля 2007 Рассказать Опубликовано: 9 февраля 2007 Данный патч добавляет поддержку докачек (HTTP_RANGE). Удобен для свалок файлов на базе DLE. Недостаток - каждая нить закачки отмечается в счетчиках, как отдельное скачивание. --- engine/download.php.orig 2007-02-09 11:59:49.000000000 +0600 +++ engine/download.php 2007-02-09 12:00:44.000000000 +0600 @@ -1,9 +1,10 @@ <? ob_start(); -function Downloadfile ($filename) +function Downloadfile ($filename,$range=0) { $handle = fopen($filename, 'rb'); + fseek($handle,$range); if ($handle === false) { return false; @@ -77,6 +78,20 @@ if ($config['files_count'] == "yes") $db->query("UPDATE " . PREFIX . "_files set dcount=dcount+1 where id ='$id'"); $db->close(); + if ($_SERVER['HTTP_RANGE']) { + $range = $_SERVER['HTTP_RANGE']; + $range = str_replace("bytes=", "", $range); + $range = str_replace("-", "", $range); + } + + if ($range>@filesize(FILE_DIR.$row['onserver'])) $range = 0; + + if ($range) { + header($_SERVER['SERVER_PROTOCOL']." 206 Partial Content"); + } else { + header($_SERVER['SERVER_PROTOCOL']." 200 OK"); + } + header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); @@ -84,8 +99,13 @@ header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename={$row['name']}"); header("Content-Transfer-Encoding: binary"); - header("Content-Length: ".@filesize(FILE_DIR.$row['onserver'])); + header("Content-Length: ".$range?(@filesize(FILE_DIR.$row['onserver'])-$range):@filesize(FILE_DIR.$row['onserver'])); + header("Last-Modified: ".date("D, d M Y H:i:s T",@filemtime(FILE_DIR.$row['onserver']))); + header("Accept-Ranges: bytes"); + if ($range) { + header("Content-Range: bytes $range-".(@filesize(FILE_DIR.$row['onserver'])-1)."/".@filesize(FILE_DIR.$row['onserver'])); + } @set_time_limit(0); - @Downloadfile(FILE_DIR.$row['onserver']) or die("File not found."); + @Downloadfile(FILE_DIR.$row['onserver'],$range) or die("File not found."); ?> Цитата Ссылка на сообщение Поделиться на других сайтах
celsoft 6 076 Опубликовано: 9 февраля 2007 Рассказать Опубликовано: 9 февраля 2007 Недостаток - каждая нить закачки отмечается в счетчиках, как отдельное скачивание. ну так у вас же есть переменная $range, сделайте проверку если она задана, то не обновлять счетчик Цитата Ссылка на сообщение Поделиться на других сайтах
LoD 0 Опубликовано: 9 февраля 2007 Рассказать Опубликовано: 9 февраля 2007 ну так у вас же есть переменная $range, сделайте проверку если она задана, то не обновлять счетчик Еще бы этот мод внести в официальную сборку Цитата Ссылка на сообщение Поделиться на других сайтах
kornel 0 Опубликовано: 13 февраля 2007 Рассказать Опубликовано: 13 февраля 2007 Автор celsoft, спасибо. Недодумался Плюс еще одну проблему пофиксил: докачка то работала, но, покрайней мере в моей сборке php не рассчитывался Content-Length, не знаю уж, что ему не понравилось. Из-за этого не работало закачка в несколько нитей в клиентах, умеющих это. Вот исправленный патч:--- engine/download.php.orig 2007-02-09 11:59:49.000000000 +0600 +++ engine/download.php 2007-02-13 17:48:22.000000000 +0600 @@ -1,9 +1,10 @@ <? ob_start(); -function Downloadfile ($filename) +function Downloadfile ($filename,$range=0) { $handle = fopen($filename, 'rb'); + fseek($handle,$range); if ($handle === false) { return false; @@ -74,9 +75,27 @@ $row = $db->super_query("SELECT name, onserver FROM " . PREFIX . "_files WHERE id ='$id'"); if (!$row) die ("Access denied"); - if ($config['files_count'] == "yes") $db->query("UPDATE " . PREFIX . "_files set dcount=dcount+1 where id ='$id'"); + + if ($_SERVER['HTTP_RANGE']) { + $range = $_SERVER['HTTP_RANGE']; + $range = str_replace("bytes=", "", $range); + $range = str_replace("-", "", $range); + } + + if ($range>@filesize(FILE_DIR.$row['onserver'])) $range = 0; + + if ($config['files_count'] == "yes" && !$range) $db->query("UPDATE " . PREFIX . "_files set dcount=dcount+1 where id ='$id'"); $db->close(); + if ($range) { + header($_SERVER['SERVER_PROTOCOL']." 206 Partial Content"); + } else { + header($_SERVER['SERVER_PROTOCOL']." 200 OK"); + } + + $etag = md5(FILE_DIR.$row['onserver']); + $etag=substr($etag, 0, 8) . '-' . substr($etag, 8, 7) . '-' . substr($etag, 15, 8); + header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); @@ -84,8 +103,16 @@ header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename={$row['name']}"); header("Content-Transfer-Encoding: binary"); - header("Content-Length: ".@filesize(FILE_DIR.$row['onserver'])); + header("Last-Modified: ".date("D, d M Y H:i:s T",@filemtime(FILE_DIR.$row['onserver']))); + header("Accept-Ranges: bytes"); + header('ETag: "' . $etag . '"'); + if ($range) { + header("Content-Range: bytes $range-".(@filesize(FILE_DIR.$row['onserver'])-1)."/".@filesize(FILE_DIR.$row['onserver'])); + header("Content-Length: ".(@filesize(FILE_DIR.$row['onserver'])-$range)); + } else { + header("Content-Length: ".@filesize(FILE_DIR.$row['onserver'])); + } @set_time_limit(0); - @Downloadfile(FILE_DIR.$row['onserver']) or die("File not found."); + @Downloadfile(FILE_DIR.$row['onserver'],$range) or die("File not found."); ?> Цитата Ссылка на сообщение Поделиться на других сайтах
raxes 0 Опубликовано: 17 февраля 2007 Рассказать Опубликовано: 17 февраля 2007 скинь пл3 переделанный (готовый) файл download.php Цитата Ссылка на сообщение Поделиться на других сайтах
raxes 0 Опубликовано: 18 февраля 2007 Рассказать Опубликовано: 18 февраля 2007 (изменено) код файла (готовый): © by kornel <? ob_start(); function Downloadfile ($filename,$range=0) { $handle = fopen($filename, 'rb'); fseek($handle,$range); if ($handle === false) { return false; } while (!feof($handle)) { print (fread($handle, 1024*8)); ob_flush(); flush(); } fclose($handle); return true; } function reset_url($url) { $value = str_replace("http://", "", $url); $value = str_replace("www.", "", $value); return reset(explode("/", $value)); } define('DATALIFEENGINE', true); define('FILE_DIR', '../uploads/files/'); define('ROOT_DIR', '..'); define('ENGINE_DIR', ROOT_DIR.'/engine'); require './data/config.php'; require_once './inc/mysql.php'; require_once './data/dbconfig.php'; require_once './modules/functions.php'; require_once './modules/sitelogin.php'; //################# Определение групп пользователей $user_group = get_vars ("usergroup"); if (!$user_group) { $user_group = array (); $db->query("SELECT * FROM " . PREFIX . "_usergroups ORDER BY id ASC"); while($row = $db->get_row()){ $user_group[$row['id']] = array (); foreach ($row as $key => $value) { $user_group[$row['id']][$key] = $value; } } set_vars ("usergroup", $user_group); $db->free(); } if (!$is_logged) {$member_id['user_group'] = 5;} if (!$user_group[$member_id['user_group']]['allow_files']) die ("Access denied"); if ($config['files_antileech']) { $_SERVER['HTTP_REFERER'] = reset_url($_SERVER['HTTP_REFERER']); $_SERVER['SERVER_NAME'] = reset_url($_SERVER['SERVER_NAME']); if ($_SERVER['SERVER_NAME'] != $_SERVER['HTTP_REFERER']) { @header('Location: ' . $config['http_home_url']); die ("Access denied!!!<br /><br />Please visit <a href=\"{$config['http_home_url']}\">{$config['http_home_url']}</a>");} } $id = intval($_REQUEST['id']); $row = $db->super_query("SELECT name, onserver FROM " . PREFIX . "_files WHERE id ='$id'"); if (!$row) die ("Access denied"); if ($_SERVER['HTTP_RANGE']) { $range = $_SERVER['HTTP_RANGE']; $range = str_replace("bytes=", "", $range); $range = str_replace("-", "", $range); } if ($range>@filesize(FILE_DIR.$row['onserver'])) $range = 0; if ($config['files_count'] == "yes" && !$range) $db->query("UPDATE " . PREFIX . "_files set dcount=dcount+1 where id ='$id'"); $db->close(); if ($range) { header($_SERVER['SERVER_PROTOCOL']." 206 Partial Content"); } else { header($_SERVER['SERVER_PROTOCOL']." 200 OK"); } $etag = md5(FILE_DIR.$row['onserver']); $etag=substr($etag, 0, 8) . '-' . substr($etag, 8, 7) . '-' . substr($etag, 15, 8); header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: private",false); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename={$row['name']}"); header("Content-Transfer-Encoding: binary"); header("Last-Modified: ".date("D, d M Y H:i:s T",@filemtime(FILE_DIR.$row['onserver']))); header("Accept-Ranges: bytes"); header('ETag: "' . $etag . '"'); if ($range) { header("Content-Range: bytes $range-".(@filesize(FILE_DIR.$row['onserver'])-1)."/".@filesize(FILE_DIR.$row['onserver'])); header("Content-Length: ".(@filesize(FILE_DIR.$row['onserver'])-$range)); } else { header("Content-Length: ".@filesize(FILE_DIR.$row['onserver'])); } @set_time_limit(0); @Downloadfile(FILE_DIR.$row['onserver'],$range) or die("File not found."); ?> Изменено 18 февраля 2007 пользователем raxes Цитата Ссылка на сообщение Поделиться на других сайтах
Alek 0 Опубликовано: 5 марта 2007 Рассказать Опубликовано: 5 марта 2007 (изменено) не чего не потерял raxes, после function Downloadfile ($filename,$range=0) { добавить @ob_end_clean(); и файл после скачивания не будет выдавать ошибку ( конец архива или файл поврежден ) Изменено 5 марта 2007 пользователем Alek Цитата Ссылка на сообщение Поделиться на других сайтах
Zdraff 4 Опубликовано: 13 мая 2007 Рассказать Опубликовано: 13 мая 2007 Спасибо огромное, работает вроде все. Цитата Ссылка на сообщение Поделиться на других сайтах
ss20 0 Опубликовано: 13 мая 2007 Рассказать Опубликовано: 13 мая 2007 спасибо... работает докачка, просьба добавить это в официальный релиз. Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.