关于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边学边教》(04.编写简易的通讯录――视频教程1)
Dec 13 PHP
在mysql数据库原有字段后增加新内容
Nov 26 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
Oct 30 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
PHP 导出Excel示例分享
Aug 18 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
Sep 22 PHP
PHP中ini_set与ini_get用法实例
Nov 04 PHP
一个经典的PHP文件上传类分享
Nov 18 PHP
php中mysql连接方式PDO使用详解
Feb 25 PHP
PHP7扩展开发教程之Hello World实现方法示例
Aug 03 PHP
laravel框架使用极光推送消息操作示例
Feb 15 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
基于mysql的论坛(4)
2006/10/09 PHP
CI框架的安全性分析
2016/05/18 PHP
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
摘自百度的图片轮换效果代码
2007/11/19 Javascript
js常见表单应用技巧
2008/01/09 Javascript
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
jquery 选项卡效果 新手代码
2011/07/08 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
javascript对象的使用和属性操作示例详解
2014/03/02 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
AngularJS在IE8的不支持的解决方法
2016/05/13 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
2017/10/26 Javascript
原生js实现省市区三级联动代码分享
2018/02/12 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
JS实现百度搜索框关键字推荐
2020/02/17 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
python操作sqlite的CRUD实例分析
2015/05/08 Python
人生苦短我用python python如何快速入门?
2018/03/12 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
Python Django切换MySQL数据库实例详解
2019/07/16 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
python判断是空的实例分享
2020/07/06 Python
Python基于xlutils修改表格内容过程解析
2020/07/28 Python
python递归函数用法详解
2020/10/26 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
python 制作本地应用搜索工具
2021/02/27 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
乌克兰移动电子产品和相关配件的在线商店:iTMag
2020/03/16 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
国贸专业的职业规划范文
2014/01/23 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
婚礼答谢礼品
2015/01/20 职场文书
5分钟教你docker安装启动redis全教程(全新方式)
2021/05/29 Redis