我有以下PHP代碼,顯示上傳文件的MIME類型。檢測MIME類型失敗php
<?php
if ($_POST) {
var_dump($_FILES);
$finfo = new finfo(FILEINFO_MIME_TYPE);
var_dump($finfo->file($_FILES['file']['tmp_name']));
} else{
?>
<form method="POST" enctype="multipart/form-data"><input name="file" type="file"><input name="submit" value="send" type="submit"/></form>
<?php
}
用這個腳本上傳somefile.csv的結果如下。
array (size=1)
'file' =>
array (size=5)
'name' => string 'somefile.csv' (length=12)
'type' => string 'text/csv' (length=8)
'tmp_name' => string '/tmp/phpKiwqtu' (length=14)
'error' => int 0
'size' => int 3561
string 'text/x-fortran' (length=14)
所以當然MIME類型應該是文本/ csv。但是我使用的框架(Symfony 1.4)使用fileinfo方法。
而且我測試遠一點似乎file --mime-type somefile.csv
返回somefile.csv: text/x-fortran
命令(在Ubuntu)和命令mimetype somefile.csv
返回somefile.csv: text/csv
。 somefile.csv是用MSOffice創建的(我不知道這是否重要)。 顯然mimetype
使用了一些很棒的mime數據庫(http://freedesktop.org/wiki/Software/shared-mime-info),而file
沒有。
- PHP是否使用
file
或mimetype
或兩者皆不? - 此外,我不確定這裏要做什麼;我上傳的文件格式錯誤?我必須使用不同的mime數據庫嗎? PHP是否被竊聽?這裏發生了什麼?
編輯:
爲什麼它被檢測爲Fortran程序的原因是因爲somefile.csv只包含以下內容:
somecolumn;
C F;
相信的上述內容CSV文件有效嗎?如果一個字段包含空格,則該字段不必放在引號內,對嗎?
http://pear.php.net/package/MIME_Type給出了相同的結果als file_info。我不明白爲什麼一個CSV文件看起來像一個fortran文件。 – meijuh 2013-04-24 11:57:30
看看Fortran代碼示例,我無法弄清楚爲什麼發生這種情況,它們完全不同。 如果您在簡單的文本編輯器中打開該特定的CSV文件,它看起來像純CSV還是其他元素可能導致混淆結果? – 2013-04-24 13:15:10
另外5美分,我搜索了很好的基於PHP的網絡應用程序,這裏有其他方法:Drupal 8似乎使用Guzzle PHP框架來完成這項工作,在https://github.com/guzzle/guzzle上查看他們的代碼。 /blob/master/src/Guzzle/Http/Mimetypes.php。 他們只是對預先定義的已知MIME類型列表進行簡單的擴展檢查。不是我要說的。 – 2013-04-24 13:21:13