2011-11-22 56 views
8

我注意到get_mime()現在已經摺舊了,所以創建以下函數的替代方法是什麼?這個函數通過我使用的cms來使用,所以需要一個可靠的選擇。PHP Mime類型檢查替代方法嗎?

// Mime Type Checker 
function get_mime ($filename,$mode=0) { 

    // mode 0 = full check 
    // mode 1 = extension check only 

    $mime_types = array(

     'txt' => 'text/plain', 
     'htm' => 'text/html', 
     'html' => 'text/html', 
     'php' => 'text/html', 
     'css' => 'text/css', 
     'js' => 'application/javascript', 
     'json' => 'application/json', 
     'xml' => 'application/xml', 
     'swf' => 'application/x-shockwave-flash', 
     'flv' => 'video/x-flv', 

     // images 
     'png' => 'image/png', 
     'jpe' => 'image/jpeg', 
     'jpeg' => 'image/jpeg', 
     'jpg' => 'image/jpeg', 
     'gif' => 'image/gif', 
     'bmp' => 'image/bmp', 
     'ico' => 'image/vnd.microsoft.icon', 
     'tiff' => 'image/tiff', 
     'tif' => 'image/tiff', 
     'svg' => 'image/svg+xml', 
     'svgz' => 'image/svg+xml', 

     // archives 
     'zip' => 'application/zip', 
     'rar' => 'application/x-rar-compressed', 
     'exe' => 'application/x-msdownload', 
     'msi' => 'application/x-msdownload', 
     'cab' => 'application/vnd.ms-cab-compressed', 

     // audio/video 
     'mp3' => 'audio/mpeg', 
     'qt' => 'video/quicktime', 
     'mov' => 'video/quicktime', 

     // adobe 
     'pdf' => 'application/pdf', 
     'psd' => 'image/vnd.adobe.photoshop', 
     'ai' => 'application/postscript', 
     'eps' => 'application/postscript', 
     'ps' => 'application/postscript', 

     // ms office 
     'doc' => 'application/msword', 
     'rtf' => 'application/rtf', 
     'xls' => 'application/vnd.ms-excel', 
     'ppt' => 'application/vnd.ms-powerpoint', 
     'docx' => 'application/msword', 
     'xlsx' => 'application/vnd.ms-excel', 
     'pptx' => 'application/vnd.ms-powerpoint', 


     // open office 
     'odt' => 'application/vnd.oasis.opendocument.text', 
     'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 
    ); 

    $ext = strtolower(array_pop(explode('.',$filename))); 

    if (function_exists('mime_content_type') && $mode==0) { 
     $mimetype = mime_content_type($filename); 
     return $mimetype; 
    } 

    if (function_exists('finfo_open') && $mode==0) { 
     $finfo = finfo_open(FILEINFO_MIME); 
     $mimetype = finfo_file($finfo, $filename); 
     finfo_close($finfo); 
     return $mimetype; 

    } elseif (array_key_exists($ext, $mime_types)) { 
     return $mime_types[$ext]; 
    } else { 
     return 'application/octet-stream'; 
    } 
} 
+0

嘗試使用文件信息功能。可能是你可以使用http://www.php.net/manual/en/ref.fileinfo.php – jeni

+0

得到你的結果FYI:[在PHP中生成MIME類型不是魔術](https://chrisjean.com/2009/02/14/generated-mime-type-in​​-php-is-not-magic /) –

回答

9

finfo_filemime_content_type的替代品。

由於finfo_file只在PHP 5.3.0+中可用,所以您所做的是正確的。如果finfo_file是可用的,那麼使用它,否則回退到mime_content_type,如果我們不能使用finfo_file,這應該是可用的。

您應該更新您的條件檢查是這樣的:

if(function_exists('mime_content_type')&&$mode==0){ 
     $mimetype = mime_content_type($filename); 
     return $mimetype; 

}elseif(function_exists('finfo_open')&&$mode==0){ 
     $finfo = finfo_open(FILEINFO_MIME); 
     $mimetype = finfo_file($finfo, $filename); 
     finfo_close($finfo); 
     return $mimetype; 
}elseif(array_key_exists($ext, $mime_types)){ 
     return $mime_types[$ext]; 
}else { 
     return 'application/octet-stream'; 
} 
+0

謝謝...這項工作爲godaddy.com託管問題.. – Sri

1
我前一陣子使用這樣的事情

,似乎只要沒關係,你有PHP版本> 5.3.0工作:

$fn = "/dir/filename.whatever" 
$mime = finfo_open(FILEINFO_MIME,$mimepath); 
$filetype = finfo_file($mime,$fn); 
finfo_close($mime); 

注意;我記得$mimepath是一個未設置的變量。這將導致finfo_open()使用其第二個參數的默認值。

+2

請注意,這可能會返回一個字符串,如「video/x-flv; charset = binary」,並且您可能不希望「 charset =二進制「部分。如果你只想返回mime類型,我建議在上面的代碼的末尾加上這一行:$ mimetype = substr($ mimetype,0,strpos($ mimetype,';')); – Andrew

0
$mime = `file --mime-type $path`; 
$mime = trim(array_pop(explode(':', $mime))); 

這對我的作品。

+0

它也適用於我 –

+1

'file -b --mime-type $ path'工作,無需'trim(array_pop(explode(':',' $ mime)));' –

+4

對於necro-comment有點遺憾,但這種方法需要了解真正的安全問題。如果你想以這種方式進行MIME檢查,ticks會執行一個shell命令,所以你需要*大量清理'$ path'。此外,您使用的是不能保證在系統上運行的POSIX命令(即Windows,自定義Linux發行版,其他操作系統)。 –