2011-03-07 16 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

、任意のとは対照的に、実際のMIMEデータベースの内容をどうする持ってfinfo

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

とバグがあるようです誤った論理。

私がやっていること(これはもっと厳しい状況には役に立たないかもしれません)は、私が必要と知っている正しい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; 
} 
関連する問題