关于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 相关文章推荐
echo(),print(),print_r()之间的区别?
Nov 19 PHP
php 小乘法表实现代码
Jul 16 PHP
初步介绍PHP扩展开发经验分享
Sep 06 PHP
PHP 验证码不显示只有一个小红叉的解决方法
Sep 30 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
Jul 22 PHP
Linux下PHP连接Oracle数据库
Aug 20 PHP
PHP实现的简单日历类
Nov 29 PHP
Dwz与thinkphp整合下的数据导出到Excel实例
Dec 04 PHP
Yii分页用法实例详解
Dec 04 PHP
discuz目录文件资料汇总
Dec 30 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
redis+php实现微博(三)微博列表功能详解
Sep 23 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安全配置详细说明
2011/09/26 PHP
CI框架中libraries,helpers,hooks文件夹详细说明
2014/06/10 PHP
PHP Opcache安装和配置方法介绍
2015/05/28 PHP
php强制用户转向www域名的方法
2015/06/19 PHP
php实现简单的上传进度条
2015/11/17 PHP
php验证身份证号码正确性的函数
2016/07/20 PHP
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
2010/12/04 Javascript
提示$ is not defined错误分析及解决
2013/04/09 Javascript
JS简单的轮播的图片滚动实例
2013/06/17 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
nodejs取得当前执行路径的方法
2018/05/13 NodeJs
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
Python爬虫之xlml解析库(全面了解)
2017/08/08 Python
Python爬虫框架Scrapy实例代码
2018/03/04 Python
Python文件读写常见用法总结
2019/02/22 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
python 随机森林算法及其优化详解
2019/07/11 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
如何基于Python和Flask编写Prometheus监控
2020/11/25 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
Structs界面控制层技术
2013/10/11 面试题
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
车辆转让协议书
2014/04/15 职场文书
学校督导评估方案
2014/06/10 职场文书
汽车运用工程专业求职信
2014/06/18 职场文书
教师节标语大全
2014/10/07 职场文书
教导主任个人总结
2015/03/03 职场文书
2016国培研修心得体会
2016/01/08 职场文书