让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实现的在线人员函数库
Apr 09 PHP
PHP的加密方式及原理
Jun 14 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
Jul 03 PHP
php判断ip黑名单程序代码实例
Feb 24 PHP
php异常处理方法实例汇总
Jun 24 PHP
smarty简单应用实例
Nov 03 PHP
php获取远程图片并下载保存到本地的方法分析
Oct 08 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
Oct 08 PHP
php判断是否连接上网络的方法实例详解
Dec 14 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
Jan 16 PHP
PHP array_reverse() 函数原理及实例解析
Jul 14 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
Dec 01 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
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
咖啡与水的关系
2021/03/03 冲泡冲煮
php数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
那些年一起学习的PHP(二)
2012/03/21 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
3种php生成唯一id的方法
2015/11/23 PHP
js模拟类继承小例子
2010/07/17 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
2018/01/31 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
vue中多路由表头吸顶实现的几种布局方式
2019/04/12 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python3随机漫步生成数据并绘制
2018/08/27 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
Python配置文件处理的方法教程
2019/08/29 Python
pygame实现俄罗斯方块游戏(对战篇1)
2019/10/29 Python
Python之Class&amp;Object用法详解
2019/12/25 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
Keras 使用 Lambda层详解
2020/06/10 Python
美国户外生活方式品牌:Eddie Bauer
2016/12/28 全球购物
英国在线药房:Express Chemist
2019/03/28 全球购物
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
过滤器的用法
2013/10/08 面试题
求职简历的自我评价怎样写好
2013/10/07 职场文书
业务主管岗位职责
2013/11/20 职场文书
医药营销个人求职信
2014/04/12 职场文书
化妆品活动策划方案
2014/05/23 职场文书
vue完美实现el-table列宽自适应
2021/05/08 Vue.js
Golang流模式之grpc的四种数据流
2022/04/13 Golang