让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 09 PHP
php 数组二分法查找函数代码
Feb 16 PHP
PHP include_path设置技巧分享
Jul 03 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
Apr 01 PHP
php获取URL中带#号等特殊符号参数的解决方法
Sep 02 PHP
PHP扩展开发入门教程
Feb 26 PHP
php中stdClass的用法分析
Feb 27 PHP
PHP实现的QQ空间g_tk加密算法
Jul 09 PHP
使用URL传输SESSION信息
Jul 14 PHP
PHP判断字符串长度的两种方法很实用
Sep 22 PHP
实例分析基于PHP微信网页获取用户信息
Nov 24 PHP
PHP常见的序列化与反序列化操作实例分析
Oct 28 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
使用JSON实现数据的跨域传输的php代码
2011/12/20 PHP
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
2013/06/26 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
让浏览器DOM元素最后加载的js方法
2014/07/29 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
2016/07/14 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
2016/07/22 Javascript
jQuery将表单序列化成一个Object对象的实例
2016/11/29 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
2018/02/14 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
python+Django+apache的配置方法详解
2016/06/01 Python
通过Python实现自动填写调查问卷
2017/09/06 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
python使用Plotly绘图工具绘制水平条形图
2020/03/25 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
2019/04/01 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
Python values()与itervalues()的用法详解
2019/11/27 Python
Pytorch 图像变换函数集合小结
2021/02/01 Python
实列教程 一款基于jquery和css3的响应式二级导航菜单
2014/11/13 HTML / CSS
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
荷兰网上药店:Drogisterij.net
2019/09/03 全球购物
家长对孩子的感言
2014/03/10 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL
Mybatis-Plus 使用 @TableField 自动填充日期
2022/04/26 Java/Android
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server