关于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模板,主要想体现一下思路
Dec 25 PHP
用php解析html的实现代码
Aug 08 PHP
深入解析PHP垃圾回收机制对内存泄露的处理
Jun 14 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
May 15 PHP
thinkphp文件引用与分支结构用法实例
Nov 26 PHP
PHP生成json和xml类型接口数据格式
May 17 PHP
php+ajax 实现输入读取数据库显示匹配信息
Oct 08 PHP
PHP加密解密函数详解
Oct 28 PHP
PHP与Ajax相结合实现登录验证小Demo
Mar 16 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
Aug 07 PHP
postman的安装与使用方法(模拟Get和Post请求)
Aug 06 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
Dec 07 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封装的分页类与简单用法示例
2019/02/25 PHP
Alliance vs Liquid BO3 第二场2.13
2021/03/10 DOTA
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
2012/07/25 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
Angularjs 滚动加载更多数据
2016/03/17 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
2016/11/29 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
Vue.js实战之组件的进阶
2017/04/04 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
Vue Autocomplete 自动完成功能简单示例
2019/05/25 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
通过实例解析vuejs如何实现调试代码
2020/07/16 Javascript
Python实现繁?转为简体的方法示例
2018/12/18 Python
python实现美团订单推送到测试环境,提供便利操作示例
2019/08/09 Python
python根据多个文件名批量查找文件
2019/08/13 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
2019/12/31 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
意大利独特而优质的家居用品:Fazzini
2018/12/05 全球购物
Aosom西班牙:家具在线商店
2020/06/11 全球购物
包装类的功能、种类、常用方法
2012/01/27 面试题
面向对象编程的优势是什么
2015/12/17 面试题
如何保障Web服务器安全
2014/05/05 面试题
银行毕业实习自我鉴定
2013/09/19 职场文书
思想汇报格式
2014/01/05 职场文书
校友会欢迎辞
2014/01/13 职场文书
迎国庆横幅标语
2014/10/08 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
死亡赔偿协议书
2015/01/28 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
关于感恩的素材句子(38句)
2019/11/11 职场文书
python自动化调用百度api解决验证码
2021/04/13 Python