2009-12-16 4 views
25

У меня есть веб-страница, которую можно использовать для загрузки файлов.
Теперь мне нужно проверить правильность типа файла (zip, jpg, pdf, ...).

Я могу использовать mimeType, который поставляется с запросом, но я не доверяю пользователю, и я хочу быть уверенным, что никто не может загрузить файл .gif, который был переименован .jpg
Я думаю, что в этом случае я должен осмотреть magic number.
This - это Java-библиотека, которую я нашел, которая, кажется, достигает того, что мне нужно, «извлекает миметик из магического номера».
Это правильное решение или что вы предлагаете?HowTo extract MimeType from byte []

UPDATE: Я нашел mime-util project и, кажется, очень хорошо и уточненный! (Может быть, лучше, чем Java мим Волшебных библиотеки?)
Here is a list полезных проектов, которые могут помочь вам извлечь MIME-тип

ответ

22

Попробуйте Java Mime Magic Library

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

Он не обнаруживает DOCX файлы правильно .. он продолжает давать приложение/зип, как MimeType ... –

+0

@ OscarPérez DOCX действительно почтовый архив, содержащий куча XML-файлов, поэтому это технически правильно. Вы можете сами проверить архив, чтобы узнать, является ли это docx или аналогичным. Вероятно, это будет недоступно для этой небольшой библиотеки. – sfussenegger

+0

@sfussenegger Что вы можете сказать об этом вопросе SO [проверить файл MIME-типа с помощью JMimeMagic] (http://stackoverflow.com/questions/15325047/check-file-of-mime-type-with-jmimemagic)? –

-2

Структура активации Sun's answer to this. И у вас вполне может быть это уже в пути к классу вашего сервера приложений.

+0

Я попробовал getContentType() для активации framework для некоторых файлов .pdf, .xls, но, к сожалению, метод всегда возвращает «application/octet-stream». только для .txt дает что-то вроде «text/plain» – mickthompson

+1

Фактически getContentType отображает только файл на основе расширения файла и карты mimeType, которую вы предоставляете ... это не то, что я ищу – mickthompson

+0

Я согласен, это не то, что вы ищете! –

8

Я уверен, что библиотека, размещенная @sfussenegger, является лучшим решением, но я делаю это вручную со следующим фрагментом, который, я надеюсь, это может помочь вам ,

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» означает «неизвестный» (на испанском языке)