如何从一个字节中提取MimeType

我有一个可以用来上传文件的网页。
现在我需要检查文件types是否正确(zip,jpg,pdf,…)。

我可以使用请求附带的mimeType,但我不信任用户,我们可以说我想确保没有人能够上传一个在.jpg中重命名的.gif文件
我认为在这种情况下,我应该检查一下这个幻数 。
这是一个Java库,我发现,似乎实现了我所需要的“从魔术数字中提取MIMEtypes”。
这是一个正确的解决scheme,或者你有什么build议?

更新:我已经find了mime-util项目 ,它似乎非常好,最新! (也许比Java Mime Magic Library更好?)
以下是可帮助您提取MIMEtypes的实用程序项目列表

试试Java Mime Magic Library

byte[] data = ... MagicMatch match = Magic.getMagicMatch(data); String mimeType = match.getMimeType(); 

我相信@sfussenegger发布的图书馆是最好的解决scheme,但是我可以用下面的代码片段来完成,我希望它能帮助你。

 DESCONOCIDO("desconocido", new byte[][] {}), PDF("PDF", new byte[][] { { 0x25, 0x50, 0x44, 0x46 } }), JPG("JPG", new byte[][] { { (byte) 0xff, (byte) 0xd8, (byte) 0xff, (byte) 0xe0 } }), RAR("RAR", new byte[][] { { 0x52, 0x61, 0x72, 0x21 } }), GIF("GIF", new byte[][] { { 0x47, 0x49, 0x46, 0x38 } }), PNG("PNG", new byte[][] { { (byte) 0x89, 0x50, 0x4e, 0x47 } }), ZIP("ZIP", new byte[][] { { 0x50, 0x4b } }), TIFF( "TIFF", new byte[][] { { 0x49, 0x49 }, { 0x4D, 0x4D } }), BMP( "BMP", new byte[][] { { 0x42, 0x4d } }); 

问候。

PD:最好的是它没有任何依赖性。 PD2:没有保证,这是正确的! PD3:“desconocido”代表“未知”(西class牙语)

激活框架是Sun对此的回答 。 你可能已经在你的应用程序服务器的类path中