2011-06-23 108 views
1

我目前正面臨一個我覺得比有趣的問題:檢測給定文件的MIME類型。 通過檢測,我的意思是隻使用文件中存在的信息來猜測MIME類型。通過文件,我的意思是一個具有名稱和內容的結構。Mime類型檢測完成正確

這裏是我知道這個問題的解決方案:

  • 試圖猜測根據文件名的文件類型。例如,如果文件名是foo.txt,我可以假設MIME類型是text/plain
  • 嘗試使用內容確定類型,特別是通常包含某種魔術代碼的第一個字節。例如,如果文件以八位組號0xCAFEBABE開頭,那麼我可以假設MIME類型是application/x-java-class

這個問題的兩種解決方法都有其優點和缺點。

第一個解決方案非常高效,但我們假設該文件具有正確的名稱,並且具有擴展名。如何檢測名爲LICENSEREADME的文件的MIME類型?

第二種技術有點複雜,必須實際讀取數據。它適用於所有包含魔術代碼的文件,但對其他文件效果不佳。可能會出現一些問題:如何區分MS-DOS EXE文件(以MZ作爲魔術代碼開始)和以字母MZ開頭的實際text/plain文件之間的區別。當您考慮其他文件類型(txt vs csv; html vs xml vs xhtml)時,許多類似的問題出現了。

因此,真正的問題來了: 如何有效和可靠地檢測MIME類型的文件?


一些旁註:

  • 我知道很多很多圖書館的存在在那裏,做的工作。我對圖書館不感興趣。我有興趣弄髒我的手。
  • 無特殊語言。我對通用算法感興趣,而不是特定的實現。
+1

當然,最好的方法是將這些信息與數據一起存儲。 OS X使用[UTI](http://en.wikipedia.org/wiki/Uniform_Type_Identifier)執行此操作。但我認爲這沒有幫助? – You

回答

1

的回答你的問題很可能只是「正則表達式」如你所要求的算法,而不是工具。實際上,在文件中尋找模式來猜測它的確是最好的方法來決定它是什麼。如果有疑問,您可以查看文件擴展名(如果可用),但不應該依賴它。例如,在UNIX系統上,操作系統在決定是否可以執行文件時不關心文件擴展名。所以文件擴展名不應該依賴。

從算法的角度來看,任務本身是微不足道的:收集標識不同文件類型的正則表達式。但是這樣做很多工作,對於每一種你想要認識的文件類型,你都需要熟悉它的設計,以便能夠寫出一個真正能夠識別文件類型的表達式,並且只有最少的誤報和漏報。

那麼爲什麼要打擾並試圖解決其他人已經投入巨資的問題呢?正如您可能知道的那樣,最普遍的解決方案是UNIX工具file及其庫libmagic,它可以輕鬆地在您的程序中使用。存在對最常見腳本語言的綁定。 file實用程序的「魔術」數據庫可能是最全面的,它知道以前從未聽說過的奇特文件類型(因爲它們已經被廣泛使用了數年或數十年),並且已經調整並修復了很長時間現在是時候了(現在38歲了)。

+0

「知道以前從未聽說過的奇特文件類型(因爲它們已經被廣泛使用了數年或數十年)」的一個潛在缺點是,你正在浪費大量資源用於沒有實際用途的東西。這種情況與ncurses terminfo數據庫非常相似,99.99%或更多的數據永遠不會被普通人使用。 :-) –