让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 相关文章推荐
ip签名探针
Oct 09 PHP
php下实现折线图效果的代码
Apr 28 PHP
php 禁止页面缓存输出
Jan 07 PHP
Windows IIS PHP 5.2 安装与配置方法
Jun 08 PHP
destoon复制新模块的方法
Jun 21 PHP
php中的观察者模式简单实例
Jan 20 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
Mar 25 PHP
PHP+jQuery翻板抽奖功能实现
Oct 19 PHP
php生成验证码函数
Oct 20 PHP
php unicode编码和字符串互转的方法
Aug 12 PHP
PHP常用的三种设计模式
Feb 17 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
Apr 26 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
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
PHP 多维数组排序实现代码
2009/08/05 PHP
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
2013/06/05 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
JS数组(Array)处理函数整理
2014/12/07 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
javascript实现的网站访问量统计代码
2015/12/20 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
jQuery中判断对象是否存在的方法汇总
2016/02/24 Javascript
老司机带你解读jQuery插件开发流程
2016/05/16 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
微信小程序form表单组件示例代码
2018/07/15 Javascript
JavaScript求一个数组中重复出现次数最多的元素及其下标位置示例
2018/07/23 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
微信小程序 textarea 层级过高问题简单解决方案
2019/10/14 Javascript
python操作MongoDB基础知识
2013/11/01 Python
wxPython使用系统剪切板的方法
2015/06/16 Python
python清除指定目录内所有文件中script的方法
2015/06/30 Python
SVM基本概念及Python实现代码
2017/12/27 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
教师师德反思材料
2014/02/15 职场文书
保洁员岗位职责
2015/02/04 职场文书
初中教师个人总结
2015/02/10 职场文书
项目投资意向书范本
2015/05/09 职场文书
鲁冰花观后感
2015/06/10 职场文书
休学证明范本
2015/06/19 职场文书
天气温馨提示语
2015/07/14 职场文书
2016学雷锋优秀志愿者事迹材料
2016/02/25 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书
员工工作心得体会
2019/05/07 职场文书
openstack中的rpc远程调用的方法
2021/07/09 Python