|
|
|
| Вот делал файловый прокси с зокачкой, но когда файл загружаеться по нескольким потокам то он повреждаеться.
Помогите пожалуйста найти ошибку:
<?
session_start();
function get_file($url)
{
$url = trim(urldecode($url));
$filepath = $url;
// Делим путь к файлу на хост и "хвост" (для сокетов)
preg_match('/\\b(?P<protocol>http?|ftp):\/\/(?P<domain>[-A-Z0-9.]+)(?P<file>\/[-A-Z0-9+&@#?\/%=~_|!:,.;$%\^*()\[\]]*)?/i', $filepath, $path_details);
$remote_file = $path_details['file'];
// Проверяем, верен ли введённый адрес
if(isset($path_details[2]) && !empty($path_details[2]))
{
$filehost = $path_details[2];
}
// Если "хвост" пуст, заполняем пустоту слешем, что бы не сглючили сокеты
if(isset($path_details[3]) && !empty($path_details[3]))
{
$filepath = $path_details[3];
}
else
{
$filepath = "/";
}
if($path_details['protocol'] == "http")
{
// Получаем заголовки отправленіе браумером нашому скрипту (только ПХП 5)
$headers = apache_request_headers();
$allheaders = "";
$range_header = "";
foreach ($headers as $header => $value)
{
$allheaders .= "$header: $value\n\n";
}
if(ereg("Range: bytes=([0-9]*)", $allheaders, $matched_array))
{
$range = $matched_array[1];
$range_header = "\nRange: bytes=".$matched_array[1]."-";
$rangedcontent = 1;
}
unset($matched_array);
// Подключаемся к файлу через сокеты
$getfile = fsockopen($filehost, 80, $errno, $errstr, 30) or die("Can't connect ot the sever");
// Добавляем в буффер путь к файлу на сервере и сам хост
fputs($getfile, "HEAD $filepath HTTP/1.0\nHOST: $filehost\nAccept: */*\nReferer: http://$filehost/\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)".$range_header."\n\n");
// Объявляенм буффер-переменную для заголовков
$temp_headers = "";
// Читаем заголовки по 4 кб, пока не дойдём до конца сокет-файла
while(!feof($getfile)) $temp_headers .= fgets($getfile, 4096);
// Ищем в полученных заголовках Content-Length, если находим,читаем его значение
if(ereg("Content-Length: ([0-9]+)", $temp_headers, $matched_array))
{
$filesize = $matched_array[1];
}
unset($matched_array);
// Определяем mime-type файла
if(ereg("Content-Type: (.*)", $temp_headers, $matched_array))
{
$filtype = $matched_array[1];
}
unset($matched_array);
$filename = str_replace("/", "", $path_details['file']);
// Закрываем сокет-файла и удаляем временные переменные
fclose($getfile);
unset($temp_headers);
unset($getfile);
$percent = $filesize/100*10;
$range = "Content-Range: bytes ".$range."-".($filesize-1)."/".$filesize;
// Вывод основного заголовка
if($rangedcontent == 1) header("HTTP/1.1 206 Partial Content");
else header("HTTP/1.1 200 OK");
// Заголовки кэширования
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
// Отправляем тип файла.
header('Content-Type: '.$filtype);
// Отправляем его размер.
header('Accept-Ranges=bytes');
header('Content-Length: '.$filesize);
// Вывод заголовка для докачки
if($rangedcontent == 1) header($range);
// Отправляем его имя.
header('Content-Disposition: attachment; filename='.$filename);
unset($filesize);
unset($filename);
unset($filtype);
$handle = fopen($url, "rb");
while(!feof($handle))
{
echo fread($handle, $percent); // Считывание файла
}
fclose($handle);
return((connection_status() == 0) and !connection_aborted());
}
else exit("Unknown Protocol");
}
if($_GET['adress'])
{
@get_file($_GET['adress']);
}
else
{
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>Перезагрузка файлов</title>
<meta http-equiv="cache-control" content="no-store" >
<meta http-equiv="pragma" content="no-cache" >
<meta http-equiv="expiries" content="Mon, 11 Dec 2005 40:21:26 GMT" >
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
</head>
<body>
<div style="position:relative;">
<center>
<script language="javascript" type="text/javascript">
function FlashGet()
{
document.forma.adress.value = "<?php echo "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; ?>?adress=" + document.forma.adress.value;
}
</script>
<form action="" method="get" name="forma">
<input type="Text" name="adress" size="100" value="<?php echo $_GET['url']; ?>">
<input type="reset" value="<< Reset">
<input type="button" onClick="FlashGet();" value=" FGet ">
<input type="Submit" value="Fast >>">
</form>
</center>
</div>
</body>
</html>
<?php
}
?>
|
Заранее благодарен | |
|
|
|
|
|
|
|
для: @ndry
(07.06.2006 в 22:06)
| | Хм... а почему нельзя испльзовать один поток?
PS Такие здоровые файлы лучше прикреплять к сообщению в виде файла. | |
|
|
|
|
|
|
|
для: cheops
(07.06.2006 в 22:38)
| | Так просто не будет работать докачка | |
|
|
|
|
|
|
|
для: @ndry
(07.06.2006 в 23:44)
| | ну помогите пожалуйста | |
|
|
|
|
|
|
|
для: @ndry
(08.06.2006 в 22:33)
| | -- | |
|
|
|
|
|
|
|
для: @ndry
(09.06.2006 в 23:35)
| | -- | |
|
|
|
|
|
|
|
для: @ndry
(07.06.2006 в 23:44)
| | Докачка будет работать, если это позволяет сервер :) насколько мне известо. | |
|
|
|
|
|
|
|
для: @ndry
(07.06.2006 в 23:44)
| | Докачка будет работать, если это позволяет сервер :) насколько мне известо. | |
|
|
|