2011-03-03 66 views
1

我正在研究PHP上傳腳本,它允許上傳PDF文件。上傳前我正在檢查application/pdf MIME類型。我有一個來自我的客戶端的PDF,我正在測試上傳腳本,並且未能通過上傳錯誤檢查並告訴我該文件是一種MIME類型application/download。我通過GMail從客戶端下載了PDF。我還用我在Photoshop中創建的PDF測試了這一點,腳本告訴我它也是application/download類型。MIME應用程序/下載

這是怎麼了檢查:

$mimeType = 'application/pdf'; 

if($_FILES[$filesName]['type'] != $mimeType) 
{ 
    throw new UploadErrorException('File is not of correct type.'); 
} 

我試圖讓安裝在我的服務器上Fileinfo的擴展名(每grunk的建議),但現在我在尋找的東西,沒有它的工作。

任何想法?謝謝!

+0

的唯一可靠方法來檢查MIME類型是FileInfo的http://www.php.net/manual/en/book.fileinfo.php你如何檢查這些信息?你的代碼的一小部分可能會有幫助 – grunk

+0

@grunk - 我剛剛添加了一段代碼。我目前沒有在我的服務器上安裝fileinfo。我將會看看我現在是否可以安裝它。謝謝你 –

+0

我想如何測試這個問題,我如何準備應用程序/下載MIME類型的PDF文件? – kicaj

回答

3

只要您的上傳腳本允許任何文件類型,只要客戶說它是PDF。某些瀏覽器無法確定MIME類型(因爲確定MIME類型是一個難題),只是發送一個通用的類型。檢查「真實」MIME類型的正確方法是使用fileinfo

如果你沒有做的FileInfo,使用下面的下拉更換(僅PDF):

if (!class_exists('finfo')) { 
    class finfo { 
    function buffer($string) { 
     switch (substr($string, 0, 4)) { 
     case '%PDF': return 'application/pdf'; 
     default: return 'application/binary'; 
     } 
    } 
    function file($file_name, $options=0, $context=NULL) { 
     $f = fopen($file_name, 'rb', false, $context); 
     if ($f === false) return false; 
     $magic = fread($f, 4); 
     fclose($f); 
     return $this->buffer($magic); 
    } 
    } 
} 
$finfo = new finfo(); 
echo $finfo->file('test.pdf'); 
+0

感謝您的光臨。我不知道人們在fileinfo之前使用了什麼? –

+1

@letseatfood我不認爲有什麼類似今天的文件格式的概念。 '文件'早於互聯網,可以追溯到1973年。 – phihag

+0

哦,有趣...但我只是想知道如何檢查沒有fileinfo的MIME類型(我的服務器沒有它)。我應該以不同的方式評論我的評論。 –

1

如果您不能使用FileInfo的任何原因,你可以打開上傳的文件,並首先檢查字節。 由於您只需要pdf文件,所以非常簡單。打開PDF文件使用文本編輯器,你可能可以看到類似

%PDF-1.5 

所以,如果上傳的文件包含%PDF,有.pdf擴展和應用程序/ PDF作爲MIME類型,你有很好的機會來處理與良好的類型。

但正如我已經說過,如果你可以使用FileInfo的這是一個更好的解決方案

+0

謝謝grunk。我將嘗試獲取並運行fileinfo。 –