让PHP支持断点续传的源码


Posted in PHP onMay 16, 2010

比如第一次请求一个文件的从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 相关文章推荐
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
Mar 13 PHP
php中OR与|| AND与&amp;&amp;的区别总结
Oct 26 PHP
Yii Framework框架获取分类下面的所有子类方法
Jun 20 PHP
PHP中foreach()用法汇总
Jul 02 PHP
php基于Snoopy解析网页html的方法
Jul 09 PHP
PHP 返回13位时间戳的实现代码
May 13 PHP
一个简单的php MVC留言本实例代码(必看篇)
Sep 22 PHP
php版微信公众账号第三方管理工具开发简明教程
Sep 23 PHP
php格式化时间戳
Dec 17 PHP
php判断/计算闰年的方法小结【三种方法】
Jul 06 PHP
Yii框架日志操作图文与实例详解
Sep 09 PHP
基于PHP实现发微博动态代码实例
Dec 11 PHP
php 获取一个月第一天与最后一天的代码
May 16 #PHP
PHP 缓存实现代码及详细注释
May 16 #PHP
PHP 防恶意刷新实现代码
May 16 #PHP
PHP 全角转半角实现代码
May 16 #PHP
php5.3 废弃函数小结
May 16 #PHP
memcached 和 mysql 主从环境下php开发代码详解
May 16 #PHP
php 中文和编码判断代码
May 16 #PHP
You might like
php代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
PHP 实现explort() 功能的详解
2013/06/20 PHP
解析PHP提交后跳转
2013/06/23 PHP
ioncube_loader_win_5.2.dll的错误解决方法
2015/01/04 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
PHP上传文件及图片到七牛的方法
2018/07/25 PHP
syntaxhighlighter 使用方法
2007/07/02 Javascript
JavaScript更改class和id的方法
2008/10/10 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
2013/01/25 Javascript
JavaScript操纵窗口的方法小结
2013/06/28 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
2016/03/01 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
vuejs动态组件给子组件传递数据的方法详解
2016/09/09 Javascript
Bootstrap和Java分页实例第二篇
2016/12/23 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
React如何实现浏览器打印部分内容详析
2019/05/19 Javascript
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
JS前端基于canvas给图片添加水印
2020/11/11 Javascript
python中subprocess批量执行linux命令
2018/04/27 Python
用python3教你任意Html主内容提取功能
2018/11/05 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
通过python连接Linux命令行代码实例
2020/02/18 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
2020/07/31 Python
Python configparser模块封装及构造配置文件
2020/08/07 Python
20岁生日感言
2014/01/13 职场文书
关于爱情的广播稿
2014/01/16 职场文书
模特职业生涯规划范文
2014/02/26 职场文书
大学生求职信例文
2014/06/29 职场文书
四则混合运算教学反思
2016/02/23 职场文书