![](/img/trans.png)
[英]Why doesn't php correctly detect a pdf mime type (wkhtmltopdf)?
[英]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.