26

我在数据库中有字节数组。

如何从java中的字节数组中提取文件扩展名(mime/type)?

4

3 回答 3

47

原来在JDK's 的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

希望这可以帮助...

于 2012-11-09T11:15:57.883 回答
14

如果这是用于存储上传的文件:

  • 为文件扩展名创建一列
  • 为浏览器发送的 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
于 2012-04-06T07:59:11.820 回答
2

也许我需要在我的数据库中保存额外的列作为文件扩展名。

这是一个比尝试根据数据库内容推断 mimetype 更好的解决方案,原因(至少)如下:

  • 如果您有来自文档源的 mime 类型,则可以存储和使用它。
  • 您可以(可能)要求用户在提交文档时指定一个 mimetype。
  • 如果您必须使用一些基于启发式的方案来确定 mimetype:
    • 您可以在创建表格行之前完成一次工作,而不是在提取它之后执行 N 次,并且
    • 您可以报告启发式没有给出好的答案的情况,并且可能要求用户说出文件类型的真正含义。

(我做了一些可能没有根据的假设,但这个问题并没有提供任何关于更大系统如何工作的线索。)

于 2012-04-06T07:45:02.790 回答