About php Support Blocking and Breakpoint Continuous File Download Function Code

  • 2021-06-28 08:56:11
  • OfStack

This article is about php streaming download, which can support file download with block and breakpoint continuation, and can be seen by friends in need.The code is as follows
 
$dowmFile = dirname ( __FILE__ ) .  ' /Nokia  �  Always Here.mp3 ' ; // Files to download, absolute or relative  
$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) { 
// Block Download  
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) { 
// Specify location to end  
if ($start >= $fsize || $start < 0) { 
$start = 0; 
$end = $fsize; 
} else { 
$end = $fsize  �  $start; 
} 
} else if (! $isset_start && $isset_end) { 
// Last n Bytes  
$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; 
} 
} 

Related articles: