php支持分块与断点续传文件下载功能代码
本文章要介绍了这篇文章是一篇关于php流下载,就是可以支持分块与断点续传文件下载,有需要的朋友可以看看,代码如下:
<?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: //开源代码phprm.com if (function_exists('mime_content_type')) { $fileSuffix = mime_content_type($filename); } else { $fileSuffix = 'application/octet-stream'; } return $fileSuffix; break; } }
本文地址:http://www.phprm.com/scxz/fs4990.html
转载随意,但请附上文章地址:-)