Php没有返回正确的mime类型

时间:2011-03-07 22:56:04

标签: php javascript css mime-types mime

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 个答案:

答案 0 :(得分:10)

我并不熟悉fileinfo的工作方式,但我认为这是正常的。文本文件(以及CSS和JS的内容)没有提供关于它具有什么内容的明确指示。它们没有头字节,没有定义的结构。所以所有可怜的fileinfo都可以猜测 - 结果不佳,正如你所看到的那样。

我认为要成功验证.js和.css文件的内容,您必须依赖扩展,或者使用正确的,适当的解析器实际解析

答案 1 :(得分:6)

目前,finfo

似乎存在错误

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

它与实际的mime数据库的内容有关,而不是任何错误的逻辑。

我正在做什么(对于更严格的情况可能没有用)是硬编码我知道我需要的正确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;
}

答案 2 :(得分: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
?>

答案 3 :(得分:1)

我最近遇到了这样一种情况,即上载的文本文件被错误地识别为“ text / x-c ++” ,因为该文件以关键字 class 。它被正确识别为“文本/纯文本” ,并且带有另一个第一个单词。 它确实可能与浏览器识别算法有关,因为这也发生在以下网站上:https://htmlstrip.com/mime-file-type-checker

答案 4 :(得分:0)

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