让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教程 变量定义
Oct 23 PHP
php 运行效率总结(提示程序速度)
Nov 26 PHP
php 批量替换html标签的实例代码
Nov 26 PHP
php通过ajax实现双击table修改内容
Apr 28 PHP
php输入数据统一类实例
Feb 23 PHP
php上传文件并存储到mysql数据库的方法
Mar 16 PHP
又拍云异步上传实例教程详解
Apr 19 PHP
PHP实现中国公民身份证号码有效性验证示例代码
May 03 PHP
php判断文件上传图片格式的实例详解
Sep 30 PHP
PHP延迟静态绑定的深入讲解
Apr 02 PHP
PHP以json或xml格式返回请求数据的方法
May 31 PHP
实例说明js脚本语言和php脚本语言的区别
Apr 04 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生成不重复标识符的方法
2014/11/21 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
如何判断图片地址是否失效
2007/02/02 Javascript
JavaScript this 深入理解
2009/07/30 Javascript
服务器端的JavaScript脚本 Node.js 使用入门
2012/03/07 Javascript
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
使用javascript实现页面定时跳转总结篇
2013/09/21 Javascript
使用nodejs开发cli项目实例
2015/06/03 NodeJs
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
jQuery实现验证年龄简单思路
2016/02/24 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
微信jssdk用法汇总
2016/07/16 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
Vue中插入HTML代码的方法
2018/09/21 Javascript
Vue项目pdf(base64)转图片遇到的问题及解决方法
2018/10/19 Javascript
详解Vue源码之数据的代理访问
2018/12/11 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
用C++封装MySQL的API的教程
2015/05/06 Python
Python实现两个list对应元素相减操作示例
2017/06/09 Python
Python利用ElementTree模块处理XML的方法详解
2017/08/31 Python
Ubuntu下使用python读取doc和docx文档的内容方法
2018/05/08 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
Django中的forms组件实例详解
2018/11/08 Python
使用Python通过oBIX协议访问Niagara数据的示例
2020/12/04 Python
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
财产公证书格式
2014/04/10 职场文书
安全承诺书格式
2014/05/21 职场文书
篮球兴趣小组活动总结
2014/07/07 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
2016年小学生教师节广播稿
2015/12/18 职场文书
研究生毕业登记表的自我鉴定范文
2019/07/15 职场文书
CSS实现漂亮的时钟动画效果的实例代码
2021/03/30 HTML / CSS