Created
January 24, 2014 18:30
-
-
Save saleemkce/8603215 to your computer and use it in GitHub Desktop.
PHP File Download Script - Download large file in chunks.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/*ini settings*/ | |
set_time_limit(0); | |
ini_set('memory_limit', '512M'); | |
//DOWNLOAD SCRIPT | |
$filePath = "G:/Software/versions/..PATH TO DOWNLOAD FILE...zip"; // set your download file path here. | |
download($filePath); // calls download function | |
function download($filePath) | |
{ | |
if(!empty($filePath)) | |
{ | |
$fileInfo = pathinfo($filePath); | |
$fileName = $fileInfo['basename']; | |
$fileExtnesion = $fileInfo['extension']; | |
$default_contentType = "application/octet-stream"; | |
$content_types_list = mimeTypes(); | |
// to find and use specific content type, check out this IANA page : http://www.iana.org/assignments/media-types/media-types.xhtml | |
if (array_key_exists($fileExtnesion, $content_types_list)) | |
{ | |
$contentType = $content_types_list[$fileExtnesion]; | |
} | |
else | |
{ | |
$contentType = $default_contentType; | |
} | |
if(file_exists($filePath)) | |
{ | |
$size = filesize($filePath); | |
$offset = 0; | |
$length = $size; | |
//HEADERS FOR PARTIAL DOWNLOAD FACILITY BEGINS | |
if(isset($_SERVER['HTTP_RANGE'])) | |
{ | |
preg_match('/bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches); | |
$offset = intval($matches[1]); | |
$length = intval($matches[2]) - $offset; | |
$fhandle = fopen($filePath, 'r'); | |
fseek($fhandle, $offset); // seek to the requested offset, this is 0 if it's not a partial content request | |
$data = fread($fhandle, $length); | |
fclose($fhandle); | |
header('HTTP/1.1 206 Partial Content'); | |
header('Content-Range: bytes ' . $offset . '-' . ($offset + $length) . '/' . $size); | |
}//HEADERS FOR PARTIAL DOWNLOAD FACILITY BEGINS | |
//USUAL HEADERS FOR DOWNLOAD | |
header("Content-Disposition: attachment;filename=".$fileName); | |
header('Content-Type: '.$contentType); | |
header("Accept-Ranges: bytes"); | |
header("Pragma: public"); | |
header("Expires: -1"); | |
header("Cache-Control: no-cache"); | |
header("Cache-Control: public, must-revalidate, post-check=0, pre-check=0"); | |
header("Content-Length: ".filesize($filePath)); | |
$chunksize = 8 * (1024 * 1024); //8MB (highest possible fread length) | |
if ($size > $chunksize) | |
{ | |
$handle = fopen($_FILES["file"]["tmp_name"], 'rb'); | |
$buffer = ''; | |
while (!feof($handle) && (connection_status() === CONNECTION_NORMAL)) | |
{ | |
$buffer = fread($handle, $chunksize); | |
print $buffer; | |
ob_flush(); | |
flush(); | |
} | |
if(connection_status() !== CONNECTION_NORMAL) | |
{ | |
echo "Connection aborted"; | |
} | |
fclose($handle); | |
} | |
else | |
{ | |
ob_clean(); | |
flush(); | |
readfile($filePath); | |
} | |
} | |
else | |
{ | |
echo 'File does not exist!'; | |
} | |
} | |
else | |
{ | |
echo 'There is no file to download!'; | |
} | |
} | |
/* Function to get correct MIME type for download */ | |
function mimeTypes() | |
{ | |
/* Just add any required MIME type if you are going to download something not listed here.*/ | |
$mime_types = array("323" => "text/h323", | |
"acx" => "application/internet-property-stream", | |
"ai" => "application/postscript", | |
"aif" => "audio/x-aiff", | |
"aifc" => "audio/x-aiff", | |
"aiff" => "audio/x-aiff", | |
"asf" => "video/x-ms-asf", | |
"asr" => "video/x-ms-asf", | |
"asx" => "video/x-ms-asf", | |
"au" => "audio/basic", | |
"avi" => "video/x-msvideo", | |
"axs" => "application/olescript", | |
"bas" => "text/plain", | |
"bcpio" => "application/x-bcpio", | |
"bin" => "application/octet-stream", | |
"bmp" => "image/bmp", | |
"c" => "text/plain", | |
"cat" => "application/vnd.ms-pkiseccat", | |
"cdf" => "application/x-cdf", | |
"cer" => "application/x-x509-ca-cert", | |
"class" => "application/octet-stream", | |
"clp" => "application/x-msclip", | |
"cmx" => "image/x-cmx", | |
"cod" => "image/cis-cod", | |
"cpio" => "application/x-cpio", | |
"crd" => "application/x-mscardfile", | |
"crl" => "application/pkix-crl", | |
"crt" => "application/x-x509-ca-cert", | |
"csh" => "application/x-csh", | |
"css" => "text/css", | |
"dcr" => "application/x-director", | |
"der" => "application/x-x509-ca-cert", | |
"dir" => "application/x-director", | |
"dll" => "application/x-msdownload", | |
"dms" => "application/octet-stream", | |
"doc" => "application/msword", | |
"dot" => "application/msword", | |
"dvi" => "application/x-dvi", | |
"dxr" => "application/x-director", | |
"eps" => "application/postscript", | |
"etx" => "text/x-setext", | |
"evy" => "application/envoy", | |
"exe" => "application/octet-stream", | |
"fif" => "application/fractals", | |
"flr" => "x-world/x-vrml", | |
"gif" => "image/gif", | |
"gtar" => "application/x-gtar", | |
"gz" => "application/x-gzip", | |
"h" => "text/plain", | |
"hdf" => "application/x-hdf", | |
"hlp" => "application/winhlp", | |
"hqx" => "application/mac-binhex40", | |
"hta" => "application/hta", | |
"htc" => "text/x-component", | |
"htm" => "text/html", | |
"html" => "text/html", | |
"htt" => "text/webviewhtml", | |
"ico" => "image/x-icon", | |
"ief" => "image/ief", | |
"iii" => "application/x-iphone", | |
"ins" => "application/x-internet-signup", | |
"isp" => "application/x-internet-signup", | |
"jfif" => "image/pipeg", | |
"jpe" => "image/jpeg", | |
"jpeg" => "image/jpeg", | |
"jpg" => "image/jpeg", | |
"js" => "application/x-javascript", | |
"latex" => "application/x-latex", | |
"lha" => "application/octet-stream", | |
"lsf" => "video/x-la-asf", | |
"lsx" => "video/x-la-asf", | |
"lzh" => "application/octet-stream", | |
"m13" => "application/x-msmediaview", | |
"m14" => "application/x-msmediaview", | |
"m3u" => "audio/x-mpegurl", | |
"man" => "application/x-troff-man", | |
"mdb" => "application/x-msaccess", | |
"me" => "application/x-troff-me", | |
"mht" => "message/rfc822", | |
"mhtml" => "message/rfc822", | |
"mid" => "audio/mid", | |
"mny" => "application/x-msmoney", | |
"mov" => "video/quicktime", | |
"movie" => "video/x-sgi-movie", | |
"mp2" => "video/mpeg", | |
"mp3" => "audio/mpeg", | |
"mpa" => "video/mpeg", | |
"mpe" => "video/mpeg", | |
"mpeg" => "video/mpeg", | |
"mpg" => "video/mpeg", | |
"mpp" => "application/vnd.ms-project", | |
"mpv2" => "video/mpeg", | |
"ms" => "application/x-troff-ms", | |
"mvb" => "application/x-msmediaview", | |
"nws" => "message/rfc822", | |
"oda" => "application/oda", | |
"p10" => "application/pkcs10", | |
"p12" => "application/x-pkcs12", | |
"p7b" => "application/x-pkcs7-certificates", | |
"p7c" => "application/x-pkcs7-mime", | |
"p7m" => "application/x-pkcs7-mime", | |
"p7r" => "application/x-pkcs7-certreqresp", | |
"p7s" => "application/x-pkcs7-signature", | |
"pbm" => "image/x-portable-bitmap", | |
"pdf" => "application/pdf", | |
"pfx" => "application/x-pkcs12", | |
"pgm" => "image/x-portable-graymap", | |
"pko" => "application/ynd.ms-pkipko", | |
"pma" => "application/x-perfmon", | |
"pmc" => "application/x-perfmon", | |
"pml" => "application/x-perfmon", | |
"pmr" => "application/x-perfmon", | |
"pmw" => "application/x-perfmon", | |
"pnm" => "image/x-portable-anymap", | |
"pot" => "application/vnd.ms-powerpoint", | |
"ppm" => "image/x-portable-pixmap", | |
"pps" => "application/vnd.ms-powerpoint", | |
"ppt" => "application/vnd.ms-powerpoint", | |
"prf" => "application/pics-rules", | |
"ps" => "application/postscript", | |
"pub" => "application/x-mspublisher", | |
"qt" => "video/quicktime", | |
"ra" => "audio/x-pn-realaudio", | |
"ram" => "audio/x-pn-realaudio", | |
"ras" => "image/x-cmu-raster", | |
"rgb" => "image/x-rgb", | |
"rmi" => "audio/mid", | |
"roff" => "application/x-troff", | |
"rtf" => "application/rtf", | |
"rtx" => "text/richtext", | |
"scd" => "application/x-msschedule", | |
"sct" => "text/scriptlet", | |
"setpay" => "application/set-payment-initiation", | |
"setreg" => "application/set-registration-initiation", | |
"sh" => "application/x-sh", | |
"shar" => "application/x-shar", | |
"sit" => "application/x-stuffit", | |
"snd" => "audio/basic", | |
"spc" => "application/x-pkcs7-certificates", | |
"spl" => "application/futuresplash", | |
"src" => "application/x-wais-source", | |
"sst" => "application/vnd.ms-pkicertstore", | |
"stl" => "application/vnd.ms-pkistl", | |
"stm" => "text/html", | |
"svg" => "image/svg+xml", | |
"sv4cpio" => "application/x-sv4cpio", | |
"sv4crc" => "application/x-sv4crc", | |
"t" => "application/x-troff", | |
"tar" => "application/x-tar", | |
"tcl" => "application/x-tcl", | |
"tex" => "application/x-tex", | |
"texi" => "application/x-texinfo", | |
"texinfo" => "application/x-texinfo", | |
"tgz" => "application/x-compressed", | |
"tif" => "image/tiff", | |
"tiff" => "image/tiff", | |
"tr" => "application/x-troff", | |
"trm" => "application/x-msterminal", | |
"tsv" => "text/tab-separated-values", | |
"txt" => "text/plain", | |
"uls" => "text/iuls", | |
"ustar" => "application/x-ustar", | |
"vcf" => "text/x-vcard", | |
"vrml" => "x-world/x-vrml", | |
"wav" => "audio/x-wav", | |
"wcm" => "application/vnd.ms-works", | |
"wdb" => "application/vnd.ms-works", | |
"wks" => "application/vnd.ms-works", | |
"wmf" => "application/x-msmetafile", | |
"wps" => "application/vnd.ms-works", | |
"wri" => "application/x-mswrite", | |
"wrl" => "x-world/x-vrml", | |
"wrz" => "x-world/x-vrml", | |
"xaf" => "x-world/x-vrml", | |
"xbm" => "image/x-xbitmap", | |
"xla" => "application/vnd.ms-excel", | |
"xlc" => "application/vnd.ms-excel", | |
"xlm" => "application/vnd.ms-excel", | |
"xls" => "application/vnd.ms-excel", | |
"xlt" => "application/vnd.ms-excel", | |
"xlw" => "application/vnd.ms-excel", | |
"xof" => "x-world/x-vrml", | |
"xpm" => "image/x-xpixmap", | |
"xwd" => "image/x-xwindowdump", | |
"z" => "application/x-compress", | |
"rar" => "application/x-rar-compressed", | |
"zip" => "application/zip"); | |
return $mime_types; | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The problem is in line no 57, it should be $filePath instead of $_FILES["file"]["tmp_name"] if you want to download an exiting file on server. $_FILES["file"]["tmp_name"] can be used if you are uploading a file using a form.
All other things are working fine