天天看點

php斷點下載下傳

php斷點下載下傳

<?php  

/** 

 * php-http斷點續傳實作 

 * @param string $path: 檔案所在路徑 

 * @param string $file: 檔案名 

 * @return void 

 */  

function download($path, $file) {  

    $real = $path . '/' . $file;  

    if (! file_exists ( $real )) {  

        return false;  

    }  

    $size = filesize ( $real );  

    $size2 = $size - 1;  

    $range = 0;  

    if (isset ( $_server ['http_range'] )) {  

        header ( 'http /1.1 206 partial content' );  

        $range = str_replace ( '=', '-', $_server ['http_range'] );  

        $range = explode ( '-', $range );  

        $range = trim ( $range [1] );  

        header ( 'content-length:' . $size );  

        header ( 'content-range: bytes ' . $range . '-' . $size2 . '/' . $size );  

    } else {  

        header ( 'content-range: bytes 0-' . $size2 . '/' . $size );  

    header ( 'accenpt-ranges: bytes' );  

    header ( 'application/octet-stream' );  

    header ( "cache-control: public" );  

    header ( "pragma: public" );  

    //解決在ie中下載下傳時中文亂碼問題  

    $ua = $_server ['http_user_agent'];  

    if (preg_match ( '/msie/', $ua )) {  

        $ie_filename = str_replace ( '+', '%20', urlencode ( $file ) );  

        header ( 'content-dispositon:attachment; filename=' . $ie_filename );  

        header ( 'content-dispositon:attachment; filename=' . $file );  

    $fp = fopen ( $real, 'rb+' );  

    fseek ( $fp, $range );  

    while ( ! feof ( $fp ) ) {  

        set_time_limit ( 0 );  

        print (fread ( $fp, 1024 )) ;  

        flush ();  

        ob_flush ();  

    fclose ( $fp );  

}  

/*end of php*/  

php斷點下載下傳

ob_start();  

$size = filesize($file_dir . $file_name);  

// 輸入檔案标簽  

header("content-type: application/octet-stream");  

header("cache-control: must-revalidate, post-check=0, pre-check=0");              

header("content-length: " . $size);  

$encoded_filename = urlencode($down_name);  

$encoded_filename = str_replace("+", "%20", $encoded_filename);  

$ua = $_server["http_user_agent"];  

// 處理下載下傳的時候的檔案名  

if (preg_match("/msie/", $ua)) {  

    header('content-disposition: attachment; filename="' . $encoded_filename . '"');  

} else if (preg_match("/firefox/", $ua)) {  

    header('content-disposition: attachment; filename*="utf8\'\'' . $down_name . '"');  

} else {  

    header('content-disposition: attachment; filename="' . $down_name . '"');  

$fp = fopen($file_dir . $file_name, "r"); // 打開檔案  

if (isset($_server['http_range']) && ($_server['http_range'] != "") && preg_match("/^bytes=([0-9]+)-/i", $_server['http_range'], $match) && ($match[1] < $size)) {  

    $range = $match[1];                  

    fseek($fp, $range);  

    header("http/1.1 206 partial content");  

    //header("date: " . gmdate("d, d m y h:i:s") . " gmt");  

    header("last-modified: " . gmdate("d, d m y h:i:s", filemtime($file_dir . $file_name)) . " gmt");  

    header("accept-ranges: bytes");  

    $rangesize = ($size - $range) > 0 ? ($size - $range) : 0;  

    header("content-length:" . $rangesize);  

    header("content-range: bytes " . $range . '-' . ($size - 1) . "/" . $size);  

    // header("connection: close" . "\n\n" );  

    //header("connection: close"." ");  

} else {                  

    header("content-length: " . (string) ($size));  

fpassthru($fp);  

ob_end_flush();  

fclose($fp);  

exit;