让PHP支持断点续传的源码

2015-01-24信息快讯网

其实说简单点就是通过这个变量$_SERVER['HTTP_RANGE']取得用户请求的文件的range,然后程序去控制文件的输出。

比如第一次请求一个文件的从0到999字节,第二次请求1000到1999字节,以此类推,每次请求1000字节的内容,然后程序通过fseek函数去取得对应的文件位置,然后输出。
$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); 

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

也是通过$_SERVER['HTTP_RANGE']取得用户请求的文件的range,具体的大家可以查看其源码分析下。这里我就当抛砖引玉了。
 
$range = 0; 
if($readmod == 4) { 
dheader('Accept-Ranges: bytes'); 
if(!emptyempty($_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)); 
} 
} 
php数组函数序列之array_unique() - 去除数组中重复的元素值
php数组函数序列之array_sum() - 计算数组元素值之和
php数组函数序列之array_key_exists() - 查找数组键名是否存在
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
提示Trying to clone an uncloneable object of class Imagic的解决
Array of country list in PHP with Zend Framework
jQuery EasyUI API 中文文档 - DateBox日期框
PHP+Mysql+jQuery实现动态展示信息
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
Admin generator, filters and I18n
php XMLWriter类的简单示例代码(RSS输出)
Sorting Array Values in PHP(数组排序)
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
php中使用Curl、socket、file_get_contents三种方法POST提交数据
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
PHP下打开URL地址的几种方法小结
php 获取一个月第一天与最后一天的代码
php select,radio和checkbox默认选择的实现方法
php radio 单选框获取与保持值的实现代码
Godaddy空间Zend Optimizer升级方法
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
PHP 开发环境配置(Zend Server安装)
asp.net Repeater控件的说明及详细介绍及使用方法
php file_get_contents函数轻松采集html数据
一个PHP的String类代码
php array_search() 函数使用
php in_array 函数使用说明与in_array需要注意的地方说明
QueryPath PHP 中的jQuery
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
php echo()和print()、require()和include()函数区别说明
Search File Contents PHP 搜索目录文本内容的代码
php中理解print EOT分界符和echo EOT的用法区别小结
php addslashes和mysql_real_escape_string
PHP has encountered an Access Violation 错误的解决方法
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
©2014-2024 dbsqp.com