2017-01-30 131 views
0

我有一個表單,它應該接受CVS文件的上傳。 所以我用下面的保護了它:在php中使用MIME類型檢測時遇到麻煩

if (!in_array($mimeType, array("text/csv"))) throw new TMSException("Error"); 

所有我的測試中順利在我的開發環境,但現在我發現,Windows客戶機上,對於完全相同的文件,我得到一個不同的MIME類型。

這是我得到我的Ubuntu電腦上連接時:

/var/www/ct/preinvoice.php:203: 
array (size=1) 
    'tariffLines' => 
    array (size=5) 
     'name' => string 'C&T - Labatut.csv' (length=17) 
     'type' => string 'text/csv' (length=8) 
     'tmp_name' => string '/tmp/php2vIcaE' (length=14) 
     'error' => int 0 
     'size' => int 3812 

這是我在嘗試上傳從Windows計算機的同一個文件時:

/var/www/ct/preinvoice.php:203: 
array (size=1) 
    'tariffLines' => 
    array (size=5) 
     'name' => string 'C&T - Labatut.csv' (length=17) 
     'type' => string 'application/vnd.ms-excel' (length=24) 
     'tmp_name' => string '/tmp/phpPaMvN3' (length=14) 
     'error' => int 0 
     'size' => int 3812 

任何IDEIA爲什麼PHP爲同一個文件檢測到不同的MIME類型?我該如何解決這個問題?

+0

MIME類型可能不是「文字/ CSV」一些系統讀取/保存他們不同。 (Internet Explorers將.csv文件視爲application/vnd.ms-excel) – Svekke

+0

嗨!我使用相同的文件測試上傳,並且在兩種環境下以及在windows中,$ _FILES [「file」] [「type」]是'application/vnd.ms-excel'; 我想我必須使用不同的方法 –

+0

客戶端設置MIME類型。你無法控制它。 – zeroflagL

回答

0

您可以通過執行以下抓住這個問題:

$mimetypes = array('application/vnd.ms-excel','text/csv'); 
if(in_array($_FILES['file']['type'],$mimetypes)){ 
    // do something 
} else { 
    die("MIME type is not allowed"); 
} 
+0

雖然你的口水是正確的,但我不想接受excel文件。我用 \t \t \t \t'$ finfo = finfo_open(FILEINFO_MIME_TYPE); \t \t \t \t $ mimeType = finfo_file($ finfo,$ _FILES [「tariffLines」] [「tmp_name」]); \t \t \t \t finfo_close($ finfo);' 強制系統檢查MIME類型。這樣,每次我得到一個「文本/純文本」MIME類型 –