Перейти к публикации

Рекомендованные сообщения

Данный патч добавляет поддержку докачек (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.");


 ?>

Ссылка на сообщение
Поделиться на других сайтах

Недостаток - каждая нить закачки отмечается в счетчиках, как отдельное скачивание.

ну так у вас же есть переменная $range, сделайте проверку если она задана, то не обновлять счетчик :)

Ссылка на сообщение
Поделиться на других сайтах

ну так у вас же есть переменная $range, сделайте проверку если она задана, то не обновлять счетчик

Еще бы этот мод внести в официальную сборку :)

Ссылка на сообщение
Поделиться на других сайтах

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.");


 ?>

Ссылка на сообщение
Поделиться на других сайтах

код файла (готовый):

© 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.");

?>

Изменено пользователем raxes
Ссылка на сообщение
Поделиться на других сайтах
  • 3 недели спустя...

не чего не потерял raxes,

после

function Downloadfile ($filename,$range=0)

{

добавить

@ob_end_clean();

и файл после скачивания не будет выдавать ошибку ( конец архива или файл поврежден )

Изменено пользователем Alek
Ссылка на сообщение
Поделиться на других сайтах
  • 2 месяца спустя...

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...