Php不能返回正确的MIME类型

7

finfo函数返回的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 !
?>

谢谢

5个回答

9
我不太了解fileinfo的运作,但我认为这是正常的。文本文件(例如CSS和JS)没有明显指示其内容的标记,没有头字节,也没有定义的结构。因此,可怜的fileinfo只能猜测 - 结果很差,就像你所看到的那样。
我认为要成功验证.js和.css文件的内容,你必须要么依赖于扩展名,要么使用正确的适当解析器来解析它们。

6

目前,finfo似乎存在一个错误

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

这与实际mime数据库的内容有关,而不是任何错误逻辑。
我所做的(对于更严格的情况可能不太有用)是硬编码我知道我需要的正确mime类型,以便下一个PHP版本只需将硬编码注释掉即可。例如:
$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;
}

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
?>

1
我最近遇到了一个情况,上传的文本文件被错误地识别为"text/x-c++",因为它以关键字"class"开头。如果使用另一个首单词,它将被正确地识别为"text/plain"。很可能与浏览器识别算法有关,因为这也发生在这个网站上:https://htmlstrip.com/mime-file-type-checker

0
你检查过服务器的MIME类型定义了吗?我假设它使用服务器的定义,就像浏览器使用客户端计算机的定义一样上传文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接