Supports downloading files in any format The function has two parameters. The first parameter is the path of the file in the server, and the second parameter is the name of the downloaded file.
- /**
- * Download file
- * filename does not include the suffix
- */
- public function download($_path, $filename = '') {
- if (file_exists($_path)) {
- $fullPath = CHtml::decode($_path);
- $filename = $filename ? $filename : substr(strrchr($fullPath, '/'), 1);
- // Parse Info / Get Extension
- $fsize = filesize($fullPath);
- $path_parts = pathinfo($ fullPath);
- $ext = strtolower($path_parts["extension"]);
-
- $filename .= '.' . $ext;
-
- // Determine Content Type
- switch ($ext) {
- case 'apk' :
- $ctype = 'application/vnd.android.package-archive';
- break;
- case 'chm':
- $ctype = 'application/octet-stream';
- break;
- case "pdf":
- $ctype = "application/pdf";
- break;
- case "txt":
- $ctype = "application/txt";
- break;
- case "zip":
- $ctype = "application/zip";
- break;
- case "doc":
- $ctype = "application/msword";
- break;
- case "xls":
- $ctype = "application/vnd.ms-excel";
- break;
- case "ppt":
- $ctype = "application/vnd.ms-powerpoint";
- break;
- case "gif":
- $ctype = "image/gif";
- break;
- case "png":
- $ctype = "image/png";
- break ;
- case "jpeg":
- case "jpg":
- $ctype = "image/jpg";
- break;
- default:
- $ctype = "application/force-download";
- }
-
- $ua = $_SERVER ["HTTP_USER_AGENT"];
- $encoded_filename = rawurlencode($filename);
- $encoded_filename = str_replace("+", "%20", $encoded_filename);
-
-
- header("Pragma: public"); // required
- header("Expires: 0");
- header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
- header("Cache-Control: private", false); // required for certain browsers
- header("Content-Type: $ctype");
- // header('Content-Disposition: attachment; filename="'.rawurlencode($filename).'"');
-
- if (preg_match("/MSIE/", $ua)) {
- header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
- } else if (preg_match("/Firefox/", $ua)) {
- header("Content-Disposition: attachment; filename*=utf8''" . $filename . '"');
- } else {
- header('Content-Disposition: attachment; filename="' . $filename . '"');
- }
-
- header("Content-Transfer-Encoding: binary");
- header("Content-Length: " . $fsize);
- ob_clean();
- flush();
- readfile($fullPath);
- } else {
- throw new Exception('File does not exist! ', 1);
- }
- }
Copy code
|