2011-03-07 220 views
7

finfo功能正在返回瘋狂的MIME類型。看下面的代碼,發生了什麼?Php不返回正確的MIME類型

<?php 
    $files = array ("css.css", "index.html", "js.js", "png.png"); 

    $info = finfo_open (FILEINFO_MIME_TYPE); 

    for ($i = 0; $i < count ($files); $i ++) { 
     $type = finfo_file ($info, $files[$i]); 

     $files[$i] = $type; 
    } 

    finfo_close ($info); 

    echo $files[0]; // text/x-c -> WHAT ?! 
    echo $files[1]; // text/html -> Ok ! 
    echo $files[2]; // text/x-c++ -> WHAT ?! 
    echo $files[3]; // image/png -> Ok ! 
?> 

感謝

回答

10

我不十分熟悉的FileInfo的工作方式,但我認爲這是正常的。文本文件(這就是CSS和JS所提供的內容)沒有明確指出它具有哪些內容。它們沒有標題字節,沒有定義的結構。因此,所有可憐的fileinfo能做的都是猜測 - 結果不佳,如你所見。

我認爲要成功驗證.js和.css文件的內容,您必須依靠擴展名,或者實際上使用正確的適當解析器來解析。

0

您是否檢查過服務器的MIME類型定義?我假設它使用服務器定義,就像瀏覽器使用客戶端計算機定義上傳文件一樣。

2

檢查這個

<?php 
$files = array ("css.css", "index.html", "js.js", "png.png"); 

    for ($i = 0; $i < count ($files); $i ++) { 
     $files[$i] = preg_replace("%.*\.(\w)%i", "$1", $files[$i]); 
    } 

    echo $files[0]; //css 
    echo $files[1]; //html 
    echo $files[2]; //js 
    echo $files[3]; //png 
?> 
6

目前,似乎是finfo

https://bugs.php.net/bug.php?id=53035

它有實際MIME數據庫的內容做一個bug,而不是任何錯誤的邏輯。

我在做什麼(對於更嚴格的情況可能沒有那麼有用)是硬編碼我知道我需要的正確的mime類型,以便硬編碼只需要在下一個註釋PHP版本。 Àla:

$info = finfo_open(FILEINFO_MIME_TYPE);  
$mime_type = finfo_file($info, $file_name); 
$extension = pathinfo($file_name,PATHINFO_EXTENSION); 

//there is a bug with finfo_file(); 
//https://bugs.php.net/bug.php?id=53035 
// 
// hard coding the correct mime types for presently needed file extensions 
switch($extension){ 

    case 'css': 
     $mime_type = 'text/css'; 
    break; 
    case 'js': 
     $mime_type = 'application/javascript'; 
    default: 
    break; 
}