让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程序的方法
Mar 09 PHP
php函数array_merge用法一例(合并同类数组)
Feb 03 PHP
php 不使用js实现页面跳转
Feb 11 PHP
php中json_encode UTF-8中文乱码的更好解决方法
Sep 28 PHP
PHP的Yii框架的常用日志操作总结
Dec 08 PHP
yii分页组件用法实例分析
Dec 28 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
PHP查看SSL证书信息的方法
Sep 22 PHP
thinkPHP自动验证机制详解
Dec 05 PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
Jun 11 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
PHP-FPM 的管理和配置详解
Feb 17 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作的文本留言本的例子(一)
2006/10/09 PHP
Smarty保留变量用法分析
2016/05/23 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
jquery api参考 visualjquery 中国线路 速度快
2007/11/30 Javascript
Jquery UI震动效果实现原理及步骤
2013/02/04 Javascript
jquery 跳到顶部和底部动画2句代码简单实现
2013/07/18 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
详解javascript new的运行机制
2016/01/26 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
javascript 单例模式详解及简单实例
2017/02/14 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
JS中如何轻松遍历对象属性的方式总结
2019/08/06 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
2019/09/12 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
Python解析网页源代码中的115网盘链接实例
2014/09/30 Python
python根据开头和结尾字符串获取中间字符串的方法
2015/03/26 Python
详解Python3中的Sequence type的使用
2015/08/01 Python
浅谈用Python实现一个大数据搜索引擎
2017/11/28 Python
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
python selenium firefox使用详解
2019/02/26 Python
python3实现mysql导出excel的方法
2019/07/31 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
canvas之万花筒效果的简单实现(推荐)
2016/08/16 HTML / CSS
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
canvas实现烟花的示例代码
2020/01/16 HTML / CSS
西班牙土拨鼠床垫公司,感觉在云端:Marmota
2019/03/18 全球购物
父亲八十大寿答谢词
2014/01/23 职场文书
留学推荐信范文
2014/05/10 职场文书
美术兴趣小组活动总结
2014/07/07 职场文书
授权委托书格式范文
2014/08/02 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
锅炉工岗位职责
2015/02/13 职场文书