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


  本文标签:php,文件,MIME类型

本文实例讲述了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程序设计有所帮助 。