如何从字节数组中提取文件扩展名

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

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

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

  • 为文件扩展名创建一列
  • 为浏览器发送的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 

原来JDKURLConnection类中有一个不错的方法,请参考以下答案: 在Java中获取文件的Mime类型

如果需要从字节数组而不是文件中提取文件扩展名,那么应该只使用java.io.ByteArrayInputStream (类来从字节数组中专门读取字节)而不是java.io.FileInputStream (用于从文件中专门读取字节的类)在以下示例中:

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

希望这可以帮助…

也许我需要在我的数据库中保存额外的列以进行文件扩展。

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

  • 如果您有文档源中的mime类型,则可以存储和使用它。
  • 您可以(可能)要求用户在提交文档时指定mimetype。
  • 如果你必须使用一些基于启发式的方案来计算mimetype:
    • 你可以在创建表格行之前完成一次工作,而不是在提取表格行之后再做N次
    • 你可以报告启发式没有给出正确答案的情况,也许可以要求用户说出文件类型到底是什么。

(我正在做一些可能无法保证的假设,但这个问题没有提供关于大型系统如何工作的任何线索。)