关于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 相关文章推荐
Ajax+PHP边学边练 之五 图片处理
Dec 03 PHP
php strcmp使用说明
Apr 22 PHP
基于PHP对XML的操作详解
Jun 07 PHP
php获取指定范围内最接近数的方法
Jun 02 PHP
10个超级有用的PHP代码片段果断收藏
Sep 23 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
Oct 08 PHP
Laravel日志用法详解
Oct 09 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
Oct 13 PHP
简单谈谈PHP中的trait
Feb 25 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
Jan 20 PHP
PHP论坛实现积分系统的思路代码详解
Jun 01 PHP
CI框架简单分页类用法示例
Jun 06 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
自己前几天写的无限分类类
2007/02/14 PHP
深入解析php模板技术原理【一】
2008/01/10 PHP
php实现从ftp服务器上下载文件树到本地电脑的程序
2009/02/10 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
百度地图API使用方法详解
2015/08/25 PHP
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
jQuery组件easyui对话框实现代码
2016/08/25 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
elementUI 动态生成几行几列的方法示例
2019/07/11 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
Python 音频生成器的实现示例
2019/12/24 Python
Python字符串hashlib加密模块使用案例
2020/03/10 Python
python求前n个阶乘的和实例
2020/04/02 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
python跨文件使用全局变量的实现
2020/11/17 Python
传播学毕业生求职信
2013/10/11 职场文书
计算机专业自荐信
2013/10/14 职场文书
大学社团活动策划书
2014/01/26 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
机械设计制造及其自动化专业求职信
2014/06/17 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
整改报告怎么写
2014/11/06 职场文书
2015年见习期工作总结
2014/12/12 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
大学生村官驻村工作心得体会
2016/01/23 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python
Vue实现跑马灯样式文字横向滚动
2021/11/23 Vue.js
Mysql中mvcc各场景理解应用
2022/08/05 MySQL