关于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 相关文章推荐
递归列出所有文件和目录
Oct 09 PHP
php 友好URL的实现(吐血推荐)
Oct 04 PHP
PHP 超链接 抓取实现代码
Jun 29 PHP
PHP与Java进行通信的实现方法
Oct 21 PHP
php预定义变量使用帮助(带实例)
Oct 30 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
Nov 07 PHP
php对接java现实加签验签的实例
Nov 25 PHP
thinkPHP交易详情查询功能详解
Dec 02 PHP
PHP实现的curl批量请求操作示例
Jun 06 PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
Apr 03 PHP
基于thinkphp6.0的success、error实现方法
Nov 05 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预定义变量9大超全局数组用法详解
2016/04/23 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
jQuery 第二课 操作包装集元素代码
2010/03/14 Javascript
Safari5中alert的无限循环BUG
2011/04/07 Javascript
Javascript 按位与运算符 (&amp;)使用介绍
2014/02/04 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
Vue-CLI项目中路由传参的方式详解
2019/09/01 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
python插入排序算法实例分析
2015/07/03 Python
python通过socket实现多个连接并实现ssh功能详解
2017/11/08 Python
python爬虫爬取淘宝商品信息
2018/02/23 Python
Python中的集合介绍
2019/01/28 Python
python接口自动化(十六)--参数关联接口后传(详解)
2019/04/16 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
Python单元测试模块doctest的具体使用
2020/02/10 Python
Python偏函数Partial function使用方法实例详解
2020/06/17 Python
英国儿童图书网站:Scholastic
2017/03/26 全球购物
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
印度购物网站:TATA CLiQ
2017/11/23 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
白酒业务员岗位职责
2013/12/27 职场文书
师生聚会感言
2014/01/26 职场文书
函授自我鉴定范文
2014/02/06 职场文书
爽歪歪广告词
2014/03/20 职场文书
工作保证书怎么写
2015/02/28 职场文书
花田少年史观后感
2015/06/16 职场文书
谢师宴家长答谢词
2015/09/30 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers
win10更新失败无限重启解决方法
2022/04/19 数码科技