关于php支持分块与断点续传文件下载功能代码


Posted in PHP onMay 09, 2014

本文章要介绍了这篇文章是一篇关于php流下载,就是可以支持分块与断点续传文件下载,有需要的朋友可以看看。代码如下

$dowmFile = dirname ( __FILE__ ) . ‘/Nokia ? Always Here.mp3′; //要下载的文件,绝对或相对 
$dowmName = ‘Nokia ? Always Here.mp3′; 
ob_start (); 
getlocalfile ( $dowmFile, $dowmName ); 
flush (); 
ob_flush (); 
function getlocalfile($fname, $filename = ”) { 
$fsize = filesize ( $fname ); 
header ( ‘Cache-Control: public' ); 
header ( ‘Pragma: public' ); 
header ( ‘Accept-Ranges: bytes' ); 
header ( ‘Connection: close' ); 
header ( ‘Content-Type: ‘ . MIMEType ( $fname ) ); 
//header(‘Content-Type: application/octet-stream'); 
if (isset ( $filename {0} )) { 
header ( ‘Content-Disposition: attachment;filename=' . $filename ); 
} 
if ($fp = @fopen ( $fname, ‘rb' )) { 
$start = 0; 
$end = $fsize; 
$isRange = isset ( $_SERVER ['HTTP_RANGE'] ) && ($_SERVER ['HTTP_RANGE'] != ”); 
if ($isRange) { 
preg_match ( ‘/^bytes=([0-9]*)-([0-9]*)$/i', $_SERVER ['HTTP_RANGE'], $match ); 
$start = $match [1]; 
$end = $match [2]; 
$isset_start = isset ( $start {0} ); 
$isset_end = isset ( $end {0} ); 
if ($isset_start && $isset_end) { 
//分块下载 
if ($start >= $fsize || $start < 0 || $start > $end) { 
$start = 0; 
$end = $fsize; 
} else if ($end >= $fsize) { 
$end = $fsize ? $start; 
} else { 
$end -= $start ? 1; 
} 
} else if ($isset_start && ! $isset_end) { 
//指定位置到结束 
if ($start >= $fsize || $start < 0) { 
$start = 0; 
$end = $fsize; 
} else { 
$end = $fsize ? $start; 
} 
} else if (! $isset_start && $isset_end) { 
//最后n个字节 
$end = $end > $fsize ? $fsize : $end; 
$start = $fsize ? $end; 
} else { 
$start = 0; 
$end = $fsize; 
} 
} 
if ($isRange) { 
fseek ( $fp, $start ); 
header ( ‘HTTP/1.1 206 Partial Content' ); 
header ( ‘Content-Length: ‘ . $end ); 
header ( ‘Content-Ranges: bytes ‘ . $start . ‘-' . ($end + $start ? 1) . ‘/' . $fsize ); 
} else { 
header ( ‘Content-Length: ‘ . $fsize ); 
} 
if (function_exists ( ‘fpassthru' ) && ($end + $start) == $fsize) { 
fpassthru ( $fp ); 
} else { 
echo fread ( $fp, $end ); 
} 
} else { 
header ( ‘Content-Length: ‘ . $fsize ); 
readfile ( $fname ); 
} 
//@header(“Content-Type: “.mime_content_type($fname)); 
} 
function MIMEType($fname) { 
$fileSuffix = strtolower ( substr ( $fname, strrpos ( $fname, ‘.' ) + 1 ) ); 
switch ($fileSuffix) { 
case ‘avi' : 
return ‘video/msvideo'; 
case ‘wmv' : 
return ‘video/x-ms-wmv'; 
case ‘txt' : 
return ‘text/plain'; 
case ‘htm' : 
case ‘html' : 
case ‘php' : 
return ‘text/html'; 
case ‘css' : 
return ‘text/css'; 
case ‘js' : 
return ‘application/javascript'; 
case ‘json' : 
case ‘xml' : 
case ‘zip' : 
case ‘pdf' : 
case ‘rtf' : 
case ‘tar' : 
return ‘application/' . $fileSuffix; 
case ‘swf' : 
return ‘application/x-shockwave-flash'; 
case ‘flv' : 
return ‘video/x-flv'; 
case ‘jpe' : 
case ‘jpg' : 
return ‘image/jpeg'; 
case ‘jpeg' : 
case ‘png' : 
case ‘gif' : 
case ‘bmp' : 
case ‘tiff' : 
return ‘image/' . $fileSuffix; 
case ‘ico' : 
return ‘image/vnd.microsoft.icon'; 
case ‘tif' : 
return ‘image/tiff'; 
case ‘svg' : 
case ‘svgz' : 
return ‘image/svg+xml'; 
case ‘rar' : 
return ‘application/x-rar-compressed'; 
case ‘exe' : 
case ‘msi' : 
return ‘application/x-msdownload'; 
case ‘cab' : 
return ‘application/vnd.ms-cab-compressed'; 
case ‘aif' : 
return ‘audio/aiff'; 
case ‘mpg' : 
case ‘mpe' : 
case ‘mp3′ : 
return ‘audio/mpeg'; 
case ‘mpeg' : 
case ‘wav' : 
case ‘aiff' : 
return ‘audio/' . $fileSuffix; 
case ‘qt' : 
case ‘mov' : 
return ‘video/quicktime'; 
case ‘psd' : 
return ‘image/vnd.adobe.photoshop'; 
case ‘ai' : 
case ‘eps' : 
case ‘ps' : 
return ‘application/postscript'; 
case ‘doc' : 
case ‘docx' : 
return ‘application/msword'; 
case ‘xls' : 
case ‘xlt' : 
case ‘xlm' : 
case ‘xld' : 
case ‘xla' : 
case ‘xlc' : 
case ‘xlw' : 
case ‘xll' : 
return ‘application/vnd.ms-excel'; 
case ‘ppt' : 
case ‘pps' : 
return ‘application/vnd.ms-powerpoint'; 
case ‘odt' : 
return ‘application/vnd.oasis.opendocument.text'; 
case ‘ods' : 
return ‘application/vnd.oasis.opendocument.spreadsheet'; 
default : 
if (function_exists ( ‘mime_content_type' )) { 
$fileSuffix = mime_content_type ( $filename ); 
} else { 
$fileSuffix = ‘application/octet-stream'; 
} 
return $fileSuffix; 
break; 
} 
}
PHP 相关文章推荐
用PHP发电子邮件
Oct 09 PHP
php通过文件头检测文件类型通用代码类(zip,rar等)
Oct 19 PHP
使用php get_headers 判断URL是否有效的解决办法
Apr 27 PHP
使用PHP下载CSS文件中的图片的代码
Sep 24 PHP
php数组合并的二种方法
Mar 21 PHP
你可能不知道PHP get_meta_tags()函数
May 12 PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 PHP
Zend Framework框架路由机制代码分析
Mar 22 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
Nov 15 PHP
记录一次排查PHP脚本执行卡住的问题
Dec 27 PHP
php设计模式之装饰模式应用案例详解
Jun 17 PHP
PDO实现学生管理系统
Mar 21 PHP
PHP程序员基本要求和必备技能
May 09 #PHP
Windows中使用计划任务自动执行PHP程序实例
May 09 #PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
May 08 #PHP
php强制文件下载而非在浏览器打开的自定义函数分享
May 08 #PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
May 08 #PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
May 08 #PHP
PHP中把stdClass Object转array的几个方法
May 08 #PHP
You might like
php中var_export与var_dump的区别分析
2010/08/21 PHP
php验证session无效的解决方法
2014/11/04 PHP
JavaScript实现滚动栏效果的方法
2015/04/27 PHP
浅谈PHP中静态方法和非静态方法的相互调用
2016/10/04 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
jquery 绑定回车动作扑捉回车键触发的事件
2014/03/26 Javascript
JS数组的遍历方式for循环与for...in
2014/07/31 Javascript
node.js适合游戏后台开发吗?
2014/09/03 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
Node.js学习之内置模块fs用法示例
2020/01/22 Javascript
Node使用koa2实现一个简单JWT鉴权的方法
2021/01/26 Javascript
vc6编写python扩展的方法分享
2014/01/17 Python
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
在Python中操作字符串之replace()方法的使用
2015/05/19 Python
将Python代码嵌入C++程序进行编写的实例
2015/07/31 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
2019/05/15 Python
python字符串和常用数据结构知识总结
2019/05/21 Python
原生python实现knn分类算法
2019/10/24 Python
python logging通过json文件配置的步骤
2020/04/27 Python
瑞典灯具和照明网上商店:Lamp24.se
2018/03/17 全球购物
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
建筑施工安全责任书
2014/07/24 职场文书
领导欢迎词范文
2015/01/26 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
导游词幽默开场白
2019/06/26 职场文书
导游词之白茶谷九龙峡
2019/10/23 职场文书
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers