Php没有返回正确的mime类型

问题描述 投票:7回答:5

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

谢谢

php javascript css mime-types mime
5个回答
10
投票

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

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


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
投票

检查一下

<?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类型定义吗?我假设它使用服务器定义,就像浏览器使用客户端计算机定义上传文件一样。

© www.soinside.com 2019 - 2024. All rights reserved.