2009-12-16 52 views
25

我有一個可以用來上傳文件的網頁。
現在我需要檢查文件類型是否正確(zip,jpg,pdf,...)。

我可以使用請求附帶的mimeType,但我不信任用戶,我們假設我想確保沒有人能夠上傳.jpg中重命名的.gif文件。
我認爲在這種情況下,我應該檢查magic number
This是一個java庫,我發現這似乎達到了我所需要的'從魔術數中提取mimetype'。
這是一個正確的解決方案,或者你有什麼建議?如何從字節中提取MimeType []

更新: 我找到了mime-util project,它看起來非常好,並且是最新的! (也許更好那麼Java啞劇魔術庫?)事業項目,可以幫助你提取MIME類型的
Here is a list

回答

22

嘗試Java Mime Magic Library

byte[] data = ... 
MagicMatch match = Magic.getMagicMatch(data); 
String mimeType = match.getMimeType(); 
+1

它沒有正確檢測到docx文件..它一直給予application/zip作爲mimetype ... – 2013-02-07 09:53:41

+0

@OscarPérez一個docx確實是一個zip壓縮文件,一堆XML文件,所以它在技術上是正確的。您可以自己檢查歸檔文件以查看它是否爲docx或類似文件。這可能會超出這個小型圖書館的範圍。 – sfussenegger 2013-02-18 14:57:09

+0

@sfussenegger你可以說這個SO問題[檢查與JMimeMagic的MIME類型文件](http://stackoverflow.com/questions/15325047/check-file-of-mime-type-with-jmimemagic)? – 2013-03-11 15:09:00

-2

激活框架是Sun's answer to this。你可能已經在你的應用程序服務器的類路徑中已經存在

+0

我試圖通過一些.pdf,.xls文件激活框架的getContentType(),但不幸的是該方法總是返回'application/octet-stream'。只爲.txt提供類似'text/plain'的文本 – mickthompson 2009-12-16 16:35:47

+1

實際上,getContentType僅根據文件擴展名和您提供的mimeType映射來映射文件...這不是我要找的 – mickthompson 2009-12-16 16:44:38

+0

我同意,那不是你要找的東西! – 2009-12-17 13:44:34

8

我確定@s​​fussenegger發佈的庫是最好的解決方案,但我用以下代碼片段手工完成,希望它能幫助你。

DESCONOCIDO("desconocido", new byte[][] {}), PDF("PDF", 
      new byte[][] { { 0x25, 0x50, 0x44, 0x46 } }), JPG("JPG", 
      new byte[][] { { (byte) 0xff, (byte) 0xd8, (byte) 0xff, 
        (byte) 0xe0 } }), RAR("RAR", new byte[][] { { 0x52, 
      0x61, 0x72, 0x21 } }), GIF("GIF", new byte[][] { { 0x47, 0x49, 
      0x46, 0x38 } }), PNG("PNG", new byte[][] { { (byte) 0x89, 0x50, 
      0x4e, 0x47 } }), ZIP("ZIP", new byte[][] { { 0x50, 0x4b } }), TIFF(
      "TIFF", new byte[][] { { 0x49, 0x49 }, { 0x4D, 0x4D } }), BMP(
      "BMP", new byte[][] { { 0x42, 0x4d } }); 

問候。

PD:最好的是它沒有任何依賴性。 PD2:沒有保證它是正確的! PD3:「desconocido」代表「未知」(用西班牙語)