您的位置:首页 > 编程语言 > PHP开发

php支持分块与断点续传文件下载功能代码

2014-05-08 16:12 926 查看
本文章要介绍了这篇文章是一篇关于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支持分块与断点续传文件下载功能代码

http://www.ihref.com/read-3191.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息