让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中改变图片的尺寸大小的代码
Jul 17 PHP
PHP的explode和implode的使用说明
Jul 17 PHP
PHP代码优化之成员变量获取速度对比
Feb 28 PHP
thinkphp3.2.2前后台公用类架构问题分析
Nov 25 PHP
如何实现php图片等比例缩放
Jul 28 PHP
php基础教程
Aug 26 PHP
zend framework重定向方法小结
May 28 PHP
PHP 搜索查询功能实现
Nov 29 PHP
Thinkphp3.2实用篇之计算型验证码示例
Feb 09 PHP
在IIS下安装PHP扩展的方法(超简单)
Apr 10 PHP
PHP实现的简单操作SQLite数据库类与用法示例
Jun 19 PHP
PHP设计模式之工厂模式详解
Oct 24 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 获取目录下的图片并随机显示的代码
2009/12/28 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
PHP 实现重载
2021/03/09 PHP
利用JQuery的load函数动态加载其它页面的内容的实现代码
2010/12/14 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
使用jQuery实现WordPress中的Ctrl+Enter和@评论回复
2016/05/21 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
详解JavaScript树结构
2017/01/09 Javascript
基于JavaScript实现瀑布流布局
2018/08/15 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
vue动态注册组件实例代码详解
2019/05/30 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
使用python装饰器验证配置文件示例
2014/02/24 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
Python3学习笔记之列表方法示例详解
2017/10/06 Python
python矩阵转换为一维数组的实例
2018/06/05 Python
Python 文本文件内容批量抽取实例
2018/12/10 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
2020/03/06 Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
2020/04/22 Python
什么是Python变量作用域
2020/06/03 Python
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
工程管理英文求职信
2014/03/18 职场文书
搞笑爱情保证书
2014/04/29 职场文书
酒店七夕情人节活动策划方案
2014/08/24 职场文书
行政执法队伍作风整顿个人剖析材料
2014/10/11 职场文书
廉政承诺书范文
2015/04/28 职场文书
环保主题班会教案
2015/08/13 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书
win10+anaconda安装yolov5的方法及问题解决方案
2021/04/29 Python
tensorflow中的数据类型dtype用法说明
2021/05/26 Python
redis缓存存储Session原理机制
2021/11/20 Redis