Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Файловый прокси
 
 автор: @ndry   (07.06.2006 в 22:06)   письмо автору
 
 

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

Помогите пожалуйста найти ошибку:

<?
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($filehost80$errno$errstr30) 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($getfile4096); 
        
// Ищем в полученных заголовках 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 == 1header("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 == 1header($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
}
?>

Заранее благодарен

   
 
 автор: cheops   (07.06.2006 в 22:38)   письмо автору
 
   для: @ndry   (07.06.2006 в 22:06)
 

Хм... а почему нельзя испльзовать один поток?

PS Такие здоровые файлы лучше прикреплять к сообщению в виде файла.

   
 
 автор: @ndry   (07.06.2006 в 23:44)   письмо автору
 
   для: cheops   (07.06.2006 в 22:38)
 

Так просто не будет работать докачка

   
 
 автор: @ndry   (08.06.2006 в 22:33)   письмо автору
 
   для: @ndry   (07.06.2006 в 23:44)
 

ну помогите пожалуйста

   
 
 автор: @ndry   (09.06.2006 в 23:35)   письмо автору
 
   для: @ndry   (08.06.2006 в 22:33)
 

--

   
 
 автор: @ndry   (12.06.2006 в 16:55)   письмо автору
 
   для: @ndry   (09.06.2006 в 23:35)
 

--

   
 
 автор: AKiRA   (12.06.2006 в 17:04)   письмо автору
 
   для: @ndry   (07.06.2006 в 23:44)
 

Докачка будет работать, если это позволяет сервер :) насколько мне известо.

   
 
 автор: AKiRA   (12.06.2006 в 17:04)   письмо автору
 
   для: @ndry   (07.06.2006 в 23:44)
 

Докачка будет работать, если это позволяет сервер :) насколько мне известо.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования