让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 相关文章推荐
提问的智慧(2)
Oct 09 PHP
40个迹象表明你还是PHP菜鸟
Sep 29 PHP
关于php mvc开发模式的感想
Jun 28 PHP
php生成略缩图代码
Jul 16 PHP
ThinkPHP的URL重写问题
Jun 22 PHP
php中file_get_contents与curl性能比较分析
Nov 08 PHP
PHP微信PC二维码登陆的实现思路
Jul 13 PHP
利用php获得flv视频长度的实例代码
Oct 26 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
Mar 31 PHP
thinkPHP中U方法加密传递参数功能示例
May 29 PHP
Swoole4.4协程抢占式调度器详解
May 23 PHP
PHP与Web页面的交互示例详解二
Aug 04 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
Linux编译升级php的详细方法
2013/11/04 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
15 个 JavaScript Web UI 库
2010/05/19 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
jquery操作select详解(取值,设置选中)
2014/02/07 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
开启BootStrap学习之旅
2016/05/04 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
jquery判断类型是不是number类型的实例代码
2016/10/07 Javascript
js选项卡的制作方法
2017/01/23 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
原生javascript实现分页效果
2017/04/21 Javascript
详解IOS微信上Vue单页面应用JSSDK签名失败解决方案
2018/11/14 Javascript
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
基于原生js实现判断元素是否有指定class名
2020/07/11 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
Python3使用requests发闪存的方法
2016/05/11 Python
Python 递归函数详解及实例
2016/12/27 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
Django choices下拉列表绑定实例
2020/03/13 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
纯CSS3实现3D旋转书本效果
2016/03/21 HTML / CSS
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
上海期货面试题
2014/01/31 面试题
服务行业口号
2014/06/11 职场文书
党委班子剖析材料
2014/08/21 职场文书
英文道歉信
2015/01/20 职场文书
北京英文导游词
2015/02/12 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
《刷子李》教学反思
2016/02/20 职场文书
大学生创业计划书
2019/06/24 职场文书
500字作文之周记
2019/12/13 职场文书
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫