让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 获取mysql数据库信息代码
Mar 12 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
Jun 28 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 PHP
ThinkPHP实现事务回滚示例代码
Jun 23 PHP
关于URL最大长度限制的相关资料查证
Dec 23 PHP
php实现约瑟夫问题的方法小结
Mar 23 PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 PHP
php支持断点续传、分块下载的类
May 02 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
Mar 16 PHP
PHP微信H5支付开发实例
Jul 25 PHP
php array 转json及java 转换 json数据格式操作示例
Nov 13 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
Jan 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
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
自己在做项目过程中学到的PHP知识收集
2012/08/20 PHP
使用Linux五年积累的一些经验技巧
2013/06/20 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
php实现根据url自动生成缩略图的方法
2014/09/23 PHP
php中header设置常见文件类型的content-type
2015/06/23 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
Javascript四舍五入Math.round()与Math.pow()使用介绍
2013/12/27 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
使用JSON作为函数的参数的优缺点
2016/10/27 Javascript
Angularjs中使用指令绑定点击事件的方法
2017/03/30 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
原生js拖拽实现图形伸缩效果
2020/02/10 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
2020/11/16 Javascript
python实现的阳历转阴历(农历)算法
2014/04/25 Python
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
Apache如何部署django项目
2017/05/21 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
Python语法分析之字符串格式化
2019/06/13 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
2020/03/06 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
《彩色世界》教学反思
2014/04/12 职场文书
工程售后服务方案
2014/06/08 职场文书
安全第一课观后感
2015/06/18 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技