Проверка файлов на основании их расширений

Я получаю файлы из очередей на Java. Они могут быть следующих форматов.

DOCXPDFдокторXLSXLSXтекстРТФ

После прочтения их расширений я хочу проверить, являются ли они на самом деле файлами этих типов.

Например, я получил файл и проверил, что он имеет расширение .xls. После этого я хочу проверить, действительно ли это файл .xls или кто-то загрузил файл другого формата после изменения его расширения.

РЕДАКТИРОВАТЬ: ЯЯ хотел бы проверить файл "Тип MIME, проверяя его содержимое, а не его расширение. Как это можно сделать?

 Duncan Jones06 нояб. 2012 г., 10:59
Вы уверены, что вам нужно это сделать? Можно'Вы просто передаете файл тому процессу, который ему нужен, и просто обрабатываете исключения, если файл недействителен?
 Duncan Jones06 нояб. 2012 г., 11:01
Кроме того, вы выигралине сможет проверить файл .txt без указания произвольных ограничений.
 Duncan Jones06 нояб. 2012 г., 12:20
Не для меня, яБоюсь. Я'было бы более интересно, если файл действителен, когда я приду его использовать. В частности, любое решение этой проблемы будет плохо масштабироваться, требуя изменений для каждого нового поддерживаемого типа файла.
 Ahmad06 нояб. 2012 г., 12:17
@Duncan ... на самом деле файл хранится в файловой системе. Поэтому, прежде чем мы сохраним, мы хотим проверить, является ли он действительным файлом или нет. имеет смысл.

Ответы на вопрос(2)

Без использования внешних библиотек:

Вы можете получить файл mimetype, используя MimetypesFileTypeMap:

    File f = new File(...);
    System.out.println(new MimetypesFileTypeMap().getContentType(f));

Вы можете получить аналогичный результат с:URLConnection.guessContentTypeFromName Оба эти решения, согласно документации, смотрят только на расширение.

Лучший вариант:URLConnection.guessContentTypeFromStream

    File f= new File(...);
    System.out.println(URLConnection.guessContentTypeFromStream(new FileInputStream(f)));

Это попытка угадать из первых байтов файла - будьте осторожны, это только предположение - я обнаружил, что это работает в большинстве случаев, но не обнаруживает некоторые очевидные типы.

Я рекомендую комбинацию обоих.

 nazar_art20 февр. 2013 г., 13:33
File f= new File(...); это (...) означает, что вам нужно перечислить расширения?
 thedayofcondor06 нояб. 2012 г., 13:48
Извините - я помню, у меня была такая же проблема в прошлом, я просто скопировал неправильное решение из моего кода!
 Duncan Jones06 нояб. 2012 г., 17:06
Я убрал -1 после вашего последнего предложения. Но я'Я до сих пор убежден, что это дуракs поручение :-) =>
 Duncan Jones06 нояб. 2012 г., 12:19
Это ответ? Кажется, вы просто отображаете расширения файлов для типов MIME, а не проверяете содержимое в соответствии с требованиями OP.

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

Например, возьмите файл XLS. Знаете ли вы, что Excel принимает при открытии такого файла? Можете ли вы быть уверены, чтоБудете в курсе любых изменений в будущих выпусках, которые могут поддерживать другой стиль кодирования?

Спросите себя - чтоЧто может случиться, если пользователь загрузит файл неправильного типа? Может ты'Я передам файл в приложение, которое обрабатывает это расширение файла, и вы 'Вы получите ошибку? Не проблема, просто передайте это пользователю!

 Ahmad06 нояб. 2012 г., 17:02
Я просто хотел проверить файлТип MIME по своему содержанию, а не по расширению.
 Duncan Jones06 нояб. 2012 г., 17:03
@ Ахмад, я понимаю, что ты хотел бы сделать. Я'Я предлагаю (по причинам, перечисленным выше), что это может быть не очень хорошая идея.

Ваш ответ на вопрос