支持任意格式的文件下载 函数有两个参数,第一个参数是文件在服务器中完成路径,第二个参数是下载显示文件名称。
- /**
- * 下载文件
- * filename 不包括后缀名
- */
- 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('文件不存在!', 1);
- }
- }
复制代码
|