php准确获取文件MIME类型的方法


Posted in PHP onJune 17, 2015

本文实例讲述了php准确获取文件MIME类型的方法。分享给大家供大家参考。具体实现方法如下:

<?php
$mime = array (
    //applications
    'ai'  => 'application/postscript',
    'eps'  => 'application/postscript',
    'exe'  => 'application/octet-stream',
    'doc'  => 'application/vnd.ms-word',
    'xls'  => 'application/vnd.ms-excel',
    'ppt'  => 'application/vnd.ms-powerpoint',
    'pps'  => 'application/vnd.ms-powerpoint',
    'pdf'  => 'application/pdf',
    'xml'  => 'application/xml',
    'odt'  => 'application/vnd.oasis.opendocument.text',
    'swf'  => 'application/x-shockwave-flash',
    // archives
    'gz'  => 'application/x-gzip',
    'tgz'  => 'application/x-gzip',
    'bz'  => 'application/x-bzip2',
    'bz2'  => 'application/x-bzip2',
    'tbz'  => 'application/x-bzip2',
    'zip'  => 'application/zip',
    'rar'  => 'application/x-rar',
    'tar'  => 'application/x-tar',
    '7z'  => 'application/x-7z-compressed',
    // texts
    'txt'  => 'text/plain',
    'php'  => 'text/x-php',
    'html' => 'text/html',
    'htm'  => 'text/html',
    'js'  => 'text/javascript',
    'css'  => 'text/css',
    'rtf'  => 'text/rtf',
    'rtfd' => 'text/rtfd',
    'py'  => 'text/x-python',
    'java' => 'text/x-java-source',
    'rb'  => 'text/x-ruby',
    'sh'  => 'text/x-shellscript',
    'pl'  => 'text/x-perl',
    'sql'  => 'text/x-sql',
    // images
    'bmp'  => 'image/x-ms-bmp',
    'jpg'  => 'image/jpeg',
    'jpeg' => 'image/jpeg',
    'gif'  => 'image/gif',
    'png'  => 'image/png',
    'tif'  => 'image/tiff',
    'tiff' => 'image/tiff',
    'tga'  => 'image/x-targa',
    'psd'  => 'image/vnd.adobe.photoshop',
    //audio
    'mp3'  => 'audio/mpeg',
    'mid'  => 'audio/midi',
    'ogg'  => 'audio/ogg',
    'mp4a' => 'audio/mp4',
    'wav'  => 'audio/wav',
    'wma'  => 'audio/x-ms-wma',
    // video
    'avi'  => 'video/x-msvideo',
    'dv'  => 'video/x-dv',
    'mp4'  => 'video/mp4',
    'mpeg' => 'video/mpeg',
    'mpg'  => 'video/mpeg',
    'mov'  => 'video/quicktime',
    'wm'  => 'video/x-ms-wmv',
    'flv'  => 'video/x-flv',
    'mkv'  => 'video/x-matroska'
    );
function _getMimeDetect() {
  if (class_exists('finfo')) {
    return 'finfo';
  } else if (function_exists('mime_content_type')) {
    return 'mime_content_type';
  } else if ( function_exists('exec')) {
    $result = exec('file -ib '.escapeshellarg(__FILE__));
    if ( 0 === strpos($result, 'text/x-php') OR 0 === strpos($result, 'text/x-c++')) {
      return 'linux';
    }
    $result = exec('file -Ib '.escapeshellarg(__FILE__));
    if ( 0 === strpos($result, 'text/x-php') OR 0 === strpos($result, 'text/x-c++')) {
      return 'bsd';
    }
  }
  return 'internal';
}
function _getMimeType($path) {
  global $mime;
  $fmime = _getMimeDetect();
  switch($fmime) {
    case 'finfo':
      $finfo = finfo_open(FILEINFO_MIME);
      if ($finfo) 
        $type = @finfo_file($finfo, $path);
      break;
    case 'mime_content_type':
      $type = mime_content_type($path);
      break;
    case 'linux':
      $type = exec('file -ib '.escapeshellarg($path));
      break;
    case 'bsd':
      $type = exec('file -Ib '.escapeshellarg($path));
      break;
    default:
      $pinfo = pathinfo($path);
      $ext = isset($pinfo['extension']) ? strtolower($pinfo['extension']) : '';
      $type = isset($mime[$ext]) ? $mime[$ext] : 'unkown';
      break;
  }
  $type = explode(';', $type);
  //需要加上这段,因为如果使用mime_content_type函数来获取一个不存在的$path时会返回'application/octet-stream'
  if ($fmime != 'internal' AND $type[0] == 'application/octet-stream') {
    $pinfo = pathinfo($path); 
    $ext = isset($pinfo['extension']) ? strtolower($pinfo['extension']) : '';
    if (!empty($ext) AND !empty($mime[$ext])) {
      $type[0] = $mime[$ext];
    }
  }
  return $type[0];
}
$path = '1.txt'; //实际上当前路径并不存在1.txt
var_dump(_getMimeType($path));
/*End of php*/

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
php中simplexml_load_string使用实例分享
Feb 13 PHP
php+memcache实现的网站在线人数统计代码
Jul 04 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
Dec 24 PHP
php中socket通信机制实例详解
Jan 03 PHP
php通过function_exists检测函数是否存在的方法
Mar 18 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
Nov 05 PHP
php有效防止同一用户多次登录
Nov 19 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
Jun 13 PHP
PHP array_shift()用法实例分析
Jan 07 PHP
使用ucenter实现多站点同步登录的讲解
Mar 21 PHP
php和asp语法上的区别总结
May 12 PHP
PHP实现提取多维数组指定一列的方法总结
Dec 04 PHP
php操作MongoDB类实例
Jun 17 #PHP
PHP实现的购物车类实例
Jun 17 #PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 #PHP
PHP基于MySQL数据库实现对象持久层的方法
Jun 17 #PHP
php使用curl打开https网站的方法
Jun 17 #PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 #PHP
PHP封装的HttpClient类用法实例
Jun 17 #PHP
You might like
解析PHP中的unset究竟会不会释放内存
2013/07/18 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
PHP实现的QQ空间g_tk加密算法
2015/07/09 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
JavaScript 入门基础知识 想学习js的朋友可以参考下
2009/12/26 Javascript
深入理解JavaScript系列(2) 揭秘命名函数表达式
2012/01/15 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
JavaScript File分段上传
2016/03/10 Javascript
easyui导出excel无法弹出下载框的快速解决方法
2016/11/10 Javascript
JS常用倒计时代码实例总结
2017/02/07 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
Angular设置别名alias的方法
2018/11/08 Javascript
laypage.js分页插件使用方法详解
2019/07/27 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
2020/02/16 Javascript
JavaScript逻辑运算符相关总结
2020/09/04 Javascript
vue3+typescript实现图片懒加载插件
2020/10/26 Javascript
python监控键盘输入实例代码
2018/02/09 Python
对pandas中to_dict的用法详解
2018/06/05 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
2019/06/17 Python
在python中实现求输出1-3+5-7+9-......101的和
2020/04/02 Python
解决TensorFlow调用Keras库函数存在的问题
2020/07/06 Python
Python依赖包迁移到断网环境操作
2020/07/13 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
eDreams澳大利亚:预订机票、酒店和度假产品
2017/04/19 全球购物
初中班主任评语大全
2014/04/24 职场文书
2014年党员承诺书范文
2014/05/20 职场文书
个人批评与自我批评材料
2014/10/17 职场文书
模范教师事迹材料
2014/12/16 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
该怎么书写道歉信?
2019/07/03 职场文书