簡體   English   中英

Php沒有返回正確的mime類型

[英]Php doesn't return the correct mime type

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

謝謝

我並不熟悉fileinfo的工作方式,但我認為這很正常。 文本文件(以及CSS和JS的內容)沒有提供關於它具有什么內容的明確指示。 它們沒有頭字節,沒有定義的結構。 因此,所有可憐的fileinfo都可以猜測 - 結果不佳,正如您所看到的那樣。

我認為要成功驗證.js和.css文件的內容,您必須依賴擴展,或者使用正確的,適當的解析器實際解析它們。

目前, 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;
}

檢查一下

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

我最近遇到的情況是,上傳的文本文件被錯誤地識別為“text / x-c ++”,因為它以關鍵字class開頭。 它被另一個第一個詞正確地識別為“text / plain” 它確實可能與瀏覽器識別算法有關,因為這也發生在這個網站上: https//htmlstrip.com/mime-file-type-checker

你檢查了服務器的mime類型定義嗎? 我假設它使用服務器定義,就像瀏覽器使用客戶端計算機定義上傳文件一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM