让PHP支持断点续传文件

发布人:kimi  时间:2007-10-24 21:46  来源: 本站原创  查看: 689次   TAG: PHP文件  断点续传 

现在的很多服务器都支持断点续传去下载软件,同时很多下载软件也是断点续传,怎么样才能让PHP也能实现断电续传功能呢?请先看下面的代码。


$fname './05e58c19552bb26b158f6621a6650899';
$fp fopen($fname,'rb'
);
$fsize filesize($fname
);

if (isset(
$_SERVER['HTTP_RANGE']) && ($_SERVER['HTTP_RANGE'] != "") && preg_match("/^bytes=([0-9]+)-$/i"$_SERVER['HTTP_RANGE'], $match) && ($match[1] < $fsize
)) { 
    
$start $match[1
];
} else {
    
$start 0
;
}

@
header("Cache-control: public"
);
@
header("Pragma: public"
);
if (
$start 0
) {
    
fseek($fp$start
);
    
Header("HTTP/1.1 206 Partial Content"
);
    
Header("Content-Length: " . ($fsize $start
));
    
Header("Content-Ranges: bytes" $start "-" . ($fsize 1) . "/" $fsize
);
} else {
    
header("Content-Length: $fsize"
);
    
Header("Accept-Ranges: bytes"
);
}

@
header("Content-Type: application/octet-stream"
); 
@
header("Content-Disposition: attachment;filename=1.rm"
); 
fpassthru($fp);


其实说简单点就是通过这个变量$_SERVER['HTTP_RANGE']取得用户请求的文件的range,然后程序去控制文件的输出。比如第一次请求一个文件的从0到999字节,第二次请求1000到1999字节,以此类推,每次请求1000字节的内容,然后程序通过fseek函数去取得对应的文件位置,然后输出。


大家也可以看下Discuz!论坛软件的attachment.php文件是如何实现断点续传的。请看代码:


$range 0;
if(
$readmod == 4
) {
    
dheader('Accept-Ranges: bytes'
);
    if(!empty(
$_SERVER['HTTP_RANGE'
])) {
        list(
$range) = explode('-',(str_replace('bytes='''$_SERVER['HTTP_RANGE'
])));
        
$rangesize = ($filesize $range) > ?  ($filesize $range) : 0
;
        
dheader('Content-Length: '.$rangesize
);
        
dheader('HTTP/1.1 206 Partial Content'
);
        
dheader('Content-Range: bytes='.$range.'-'.($filesize-1).'/'.($filesize
));
    }
}


也是通过$_SERVER['HTTP_RANGE']取得用户请求的文件的range,具体的大家可以查看其源码分析下。这里我就当抛砖引玉了。

本月热门