php利用$_SERVER['HTTP_RANG']实现断点续传


<?php_egg_logo_guid
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) > 0 ? (filesize - range) : 0;
	dheader('Content-Length: '.rangesize);
	dheader('HTTP/1.1 206 Partial Content');
	dheader('Content-Range: bytes='.range.'-'.(filesize-1).'/'.(filesize));
	}
}


下一篇

评论



分享

热门文章

最新加入

最新评论

ss就这样吧: 还是用原声的写吧,这样就不会出现兼容性的问题了 。 查看原文 05月25日 15:55
指尖: 数据库主从配置 查看原文 03月03日 11:26




kefu
0.0754s