2012-04-06 64 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

相关问题