2011-03-07 233 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; 
}