如何从字节数组中提取文件扩展名
答
如果这是存储被上载的文件:
- 创建文件名扩展
- 创建的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
答
也许我需要保存额外的列在我的数据库文件扩展名。
这是不是试图基于数据库的内容来推断一个MIME类型更好的解决方案,(至少)有以下原因:
- 如果源文件中的MIME类型,你可以存储和使用它。
- 您可能(可能)要求用户在提交文档时指定MIME类型。
- 如果有用于找出一个MIME类型的一些启发式方案:一次提取之后创建的表行,而不是N次为止
- 你可以做的工作,并
- 你可以报告启发式不提供良好答案的情况,并且可能要求用户说出文件类型的真实含义。
(我正在做一些假设,可能得不到保证,但问题并没有给于更大的系统是如何打算工作的任何线索。)
答
原来存在JDK
的URLConnection
类像样的方法,请参考以下答案: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
希望这有助于...
'字节array'是字节,仅此而已的数组。如果你有一个'字节数组' - 你不能说存储在那里的东西。你可以试着猜测字节数组的内容,但它只不过是猜测。 – bezmax 2012-04-06 07:17:07
我不这么认为,我可以用MagicMatch类做到这一点,但为此我需要导入外部jar。我正在寻找别的东西。 byte [] data = ... MagicMatch match = Magic.getMagicMatch(data); String mimeType = match.getMimeType(); – emilan 2012-04-06 07:20:59
我的意思是说 - 没有任何地方保存在一个字节数组中的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