Вопрос по file-upload, java, ms-word, excel, pdf – Проверка файлов на основании их расширений

1

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

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

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

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

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

@Duncan ... на самом деле файл хранится в файловой системе. Поэтому, прежде чем мы сохраним, мы хотим проверить, является ли он действительным файлом или нет. имеет смысл. Ahmad
Вы уверены, что вам нужно это сделать? Можно'Вы просто передаете файл тому процессу, который ему нужен, и просто обрабатываете исключения, если файл недействителен? Duncan Jones
Кроме того, вы выигралине сможет проверить файл .txt без указания произвольных ограничений. Duncan Jones
Не для меня, яБоюсь. Я'было бы более интересно, если файл действителен, когда я приду его использовать. В частности, любое решение этой проблемы будет плохо масштабироваться, требуя изменений для каждого нового поддерживаемого типа файла. Duncan Jones

Ваш Ответ

2   ответа
3

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

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

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

@ Ахмад, я понимаю, что ты хотел бы сделать. Я'Я предлагаю (по причинам, перечисленным выше), что это может быть не очень хорошая идея. Duncan Jones
Я просто хотел проверить файлТип MIME по своему содержанию, а не по расширению. Ahmad
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)));

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

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

Это ответ? Кажется, вы просто отображаете расширения файлов для типов MIME, а не проверяете содержимое в соответствии с требованиями OP. Duncan Jones
File f= new File(...); это (...) означает, что вам нужно перечислить расширения? nazar_art
Извините - я помню, у меня была такая же проблема в прошлом, я просто скопировал неправильное решение из моего кода! thedayofcondor
Я убрал -1 после вашего последнего предложения. Но я'Я до сих пор убежден, что это дуракs поручение :-) => Duncan Jones

Похожие вопросы