让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 相关文章推荐
PHP与SQL注入攻击[二]
Apr 17 PHP
php采集速度探究总结(原创)
Apr 18 PHP
网页游戏开发入门教程二(游戏模式+系统)
Nov 02 PHP
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
Aug 09 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
Oct 16 PHP
微信营销平台系统?刮刮乐的开发
Jun 10 PHP
php输入流php://input使用浅析
Sep 02 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
Oct 16 PHP
PHP执行SQL文件并将SQL文件导入到数据库
Sep 17 PHP
在WordPress中实现发送http请求的相关函数解析
Dec 29 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
Sep 30 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更新mysql后获取影响的行数发生异常解决方法
2013/03/28 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
2015/03/26 PHP
php实现登录页面的简单实例
2019/09/29 PHP
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
javascript中的继承实例代码
2011/04/27 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
json数据的列循环示例
2013/09/06 Javascript
js与C#进行时间戳转换
2014/11/14 Javascript
浅谈js中变量初始化
2015/02/03 Javascript
JavaScript日期类型的一些用法介绍
2015/03/02 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
JavaScript生成图形验证码
2020/08/24 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
2020/07/18 Javascript
javascript实现拼图游戏
2021/01/29 Javascript
python支持断点续传的多线程下载示例
2014/01/16 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
详解Python3中setuptools、Pip安装教程
2019/06/18 Python
Numpy一维线性插值函数的用法
2020/04/22 Python
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
美国波西米亚风格精品店:South Moon Under
2019/10/26 全球购物
英国在线滑雪板和冲浪商店:The Board Basement
2020/01/11 全球购物
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
通信工程专业毕业生推荐信
2013/12/25 职场文书
党员教师群众路线个人整改措施
2014/10/28 职场文书
借款民事起诉状范文
2015/05/19 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
学校财务管理制度
2015/08/04 职场文书
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android