2012-04-06 66 views
14

我有數據庫中的字節數組。如何從字節數組中提取文件擴展名

如何從java中的字節數組中提取文件擴展名(mime/type)?

+0

'字節array'是字節,僅此而已的數組。如果你有一個'字節數組' - 你不能說存儲在那裏的東西。你可以試着猜測字節數組的內容,但它只不過是猜測。 – bezmax 2012-04-06 07:17:07

+0

我不這麼認爲,我可以用MagicMatch類做到這一點,但爲此我需要導入外部jar。我正在尋找別的東西。 byte [] data = ... MagicMatch match = Magic.getMagicMatch(data); String mimeType = match.getMimeType(); – emilan 2012-04-06 07:20:59

+0

我的意思是說 - 沒有任何地方保存在一個字節數組中的mimetype(除了支持它的某些數據類型)。例如,如果你有一個寫入字節數組的Hello World.txt文件,你將會有11個字節:'H,e,l,l,o,w,o,r,l,d'。你可以看到沒有mimetype。什麼'魔力'庫做 - 它試圖**文件的內容猜測**文件類型。有點類似反病毒軟件尋找病毒的模式,這些類型的庫試圖通過這些mimetypes的一些特定模式來猜測mimetype。 – bezmax 2012-04-06 07:24:33

回答

10

如果這是存儲被上載的文件:

  • 創建文件名擴展
  • 創建的mime類型的列的列由瀏覽器所發送

如果你沒有原始文件,而你只有字節,你有幾個好的解決方案。

如果你能夠使用圖書館,看看使用MIME-UTIL檢查字節:

http://technopaper.blogspot.com/2009/03/identifying-mime-using-mime-util.html

如果必須建立自己的字節檢測,這裏有許多最流行開始字節:

"BC" => bitcode, 
"BM" => bitmap, 
"BZ" => bzip, 
"MZ" => exe, 
"SIMPLE"=> fits, 
"GIF8" => gif, 
"GKSM" => gks, 
[0x01,0xDA].pack('c*') => iris_rgb, 
[0xF1,0x00,0x40,0xBB].pack('c*') => itc, 
[0xFF,0xD8].pack('c*') => jpeg, 
"IIN1" => niff, 
"MThd" => midi, 
"%PDF" => pdf, 
"VIEW" => pm, 
[0x89].pack('c*') + "PNG" => png, 
"%!" => postscript, 
"Y" + [0xA6].pack('c*') + "j" + [0x95].pack('c*') => sun_rasterfile, 
"MM*" + [0x00].pack('c*') => tiff, 
"II*" + [0x00].pack('c*') => tiff, 
"gimp xcf" => gimp_xcf, 
"#FIG" => xfig, 
"/* XPM */" => xpm, 
[0x23,0x21].pack('c*') => shebang, 
[0x1F,0x9D].pack('c*') => compress, 
[0x1F,0x8B].pack('c*') => gzip, 
"PK" + [0x03,0x04].pack('c*') => pkzip, 
"MZ" => dos_os2_windows_executable, 
".ELF" => unix_elf, 
[0x99,0x00].pack('c*') => pgp_public_ring, 
[0x95,0x01].pack('c*') => pgp_security_ring, 
[0x95,0x00].pack('c*') => pgp_security_ring, 
[0xA6,0x00].pack('c*') => pgp_encrypted_data, 
[0xD0,0xCF,0x11,0xE0].pack('c*') => docfile 
2

也許我需要保存額外的列在我的數據庫文件擴展名。

這是不是試圖基於數據庫的內容來推斷一個MIME類型更好的解決方案,(至少)有以下原因:

  • 如果源文件中的MIME類型,你可以存儲和使用它。
  • 您可能(可能)要求用戶在提交文檔時指定MIME類型。
  • 如果用於找出一個MIME類型的一些啓發式方案:一次提取之後創建的錶行,而不是N次爲止
    • 你可以做的工作,並
    • 你可以報​​告啓發式不提供良好答案的情況,並且可能要求用戶說出文件類型的真實含義。

(我正在做一些假設,可能得不到保證,但問題並沒有給於更大的系統是如何打算工作的任何線索。)

31

原來存在JDKURLConnection類像樣的方法,請參考以下答案:Getting A File's Mime Type In Java

如果需要從字節數組中提取文件擴展名而不是文件,則應使用java.io.ByteArrayInputStream(專門從字節數組中讀取字節的類)而不是java.io.FileInputStream(專門從文件讀取字節的類),如下例所示:

byte[] content = ; 
InputStream is = new ByteArrayInputStream(content); 
String mimeType = URLConnection.guessContentTypeFromStream(is); 
//...close stream 

希望這有助於...

+0

僅當您可以將字節數組內容寫入文件然後再讀回時纔有用,這不是原始問題的一部分。 (我處於同樣的情況。) – jmkgreen 2013-01-30 10:05:19

+7

不,不用,這個解決方案可以處理任何字節流 - 請再次參考我編輯的答案。在Java中,'InputStream'是對'任何可以讀取字節的地方'的抽象,所以當需要'InputStream'時 - 這只是找到正確的'InputStream'實現的問題。 – Yura 2013-01-30 12:33:12

+0

像魅力一樣工作,謝謝! – MSwezey 2015-09-14 19:19:38

相關問題