2010-07-05 2 views
0
function Ifurl($subject) 
    { 
    $pattern = "/http:\/\//"; 
    $regex = preg_match_all($pattern, $subject, $array); 
    if ($regex == 1) 
    { 
     return true; //true that it exist 
    } 
    else 
    { 
     return false; 
    } 
} 

    function get_start_point($env_http_range) 
{ 
    //Calculate start point 
    $range = $env_http_range; // usually set to $_SERVER['HTTP_RANGE'] 
    if ($range != '') 
    { 
     $p1 = strpos($range, "bytes="); 
     $p2 = strpos($range, "-"); 
     $offset = substr($range, $p1+6, $p2-($p1+6)); 
    } else { 
     $offset = 0; 
    } 


    return $offset; 
} 


    function Output($url,$range,$range2) //cant record output 8192 not full amount 

    { 
    $opts = array('http'=>array('method'=>"GET",'header'=>"Range: bytes=$range-$range2")); 

    $context = stream_context_create($opts); 
    $fp  = fopen($url, 'r', false, $context); 
    while(!feof($fp) && !connection_aborted()) 
    { 
    $data_transferred += 1024 * 8; 
    fpassthru($fp); 
    } 
    $status = (!connection_aborted()); 
    log_this($data_transferred); 
    fclose($httphandle); 
    } 

    function log_this($line) 
{ 
    $filename = 'download_log.txt'; 
    $handle = fopen($filename, 'a'); 
    fwrite($handle, $line . "\n"); 
} 


function url($url) 
{ 
    $define_url = Ifurl($url); //define if the url is true! 
    if ($define_url == 1) 
    { 
     $filename = basename($url); //define the filename of the file 
     $httphandle = fopen($url, "r"); //open the file and read the information 
     $headers  = stream_get_meta_data($httphandle); 
     $filesize = $headers['wrapper_data'][6]; //define the file conent size 
     $filecontent = $headers['wrapper_data'][8]; //get the file content 
     $pattern  = "/(\d+)/"; //get all filesize dg 
     preg_match_all($pattern, $filesize, $array); 
     $filesize = $array[0][0]; //get the filesize; 
     $returnarray = array("Filename" => $filename,"Filesize" => $filesize, "Fileurl" => $url,"Filecontent" => $filecontent); 
     return $returnarray; 
    } 
    else 
    { 

     return "Unable"; //unable to make request! 
    } 

} 



function XD($url) 
{ 

$graburl  = url($url); 
$filename = $graburl['Filename']; 
$filesize = $graburl['Filesize']; 
$filurl  = $graburl['Fileurl']; 
$filecontent = $graburl['Filecontent']; 

/////////////////////////////////////////// 
set_magic_quotes_runtime(0); 
ini_set('output_buffering', 'Off'); 
ob_end_clean(); 
ini_set('zlib.output_compression', 'Off'); 
ignore_user_abort(true); 


//////////////////////////////////////////// 


@header("Cache-Control:"); 
@header("Cache-Control: public"); 
@header("Content-Type: application/octet-stream"); 
@header("Content-Disposition: attachment; filename=".$filename); 
@header("Accept-Ranges: bytes"); 


    $log = get_start_point($_SERVER['HTTP_RANGE']); 
    log_this($log); 

    if(isset($_SERVER['HTTP_RANGE'])) 
    { 
    list($a, $range)=explode("=",$_SERVER['HTTP_RANGE']); 
    list($range1,$range2) = explode("-", $range); 
    if ($range2 == '' or $range2 < 0 or $range2 >= $filesize) { 
     $range2 = $filesize -1; 
    }; 
    if ($range1 < 0 or $range1 > $range2) { 
     $range1 = 0; 
    } 
    $new_length = $range2 - $range1 + 1; 

    @header("HTTP/1.1 206 Partial Content"); 
    @header("Content-Range: bytes $range1-$range2/$filesize"); 
    @header("Content-Length: $new_length"); 


    Output($url,$range1,$range2); 

} 
else { 
    @header("Content-Length: ".$filesize); 

     $httphandle = fopen($url, "r"); //open the file and read the information 
     while (!feof($httphandle) && !connection_aborted()) 
     { 
     $data_transferred += 1024 * 8; 
     echo fread($httphandle, 1024 * 8); 
      flush(); 
     ob_end_flush(); 
     } 
     $status = (!connection_aborted()); 
     log_this($data_transferred); 
     fclose($httphandle); 
} 

    } 


XD('http://rarlabs.com/rar/wrar393.exe') 

Я пытаюсь возобновить загрузку и запись байтов, загруженных с помощью буфера, код отлично работает! Но я не могу записать полное количество байтов, загруженных от пользователя, функция Output ведет переговоры с сервером о отправке байтов, которые пользователь оставил. Я записываю его с текстовым файлом в качестве теста, когда пользователь загружает его в журнал байты, которые пользователь загружает, сохраняя его в текстовый файл, однако единственная проблема заключается в том, когда пользователь вызывает функцию вывода, журнал не записывает, сколько байтов я пытаюсь использовать fread, но код переходит в chas, как я могу зарегистрировать пользователя для общего количество загруженных байтов?Как узнать, сколько байтов было отправлено?

+0

Предлагаю вам использовать полные остановки. Я не понял эту проблему. Что это означает «когда пользователь вызывает его функцию?»? – Artefacto

+0

Функция Выход ($ url, $ range, $ range2) – Saxtor

ответ

0

Вы смотрели в завитка расширения?

+0

curl Я хочу знать, как регистрировать пользователя, сколько байтов пользователь downlaoded – Saxtor

+0

Я уверен, что curl может отслеживать переданные байты. Пойдите, прочитайте документацию. – Kalium

+0

Я мог бы вам объяснить, как можно было бы тогда отслеживать байты, когда пользователь загружает файл. – Saxtor

Смежные вопросы