Как определить соответствующее расширение файла из mime Type в Java

я загружаю файлы в корзину Amazon s3 и имею доступ к InputStream и строке, содержащей тип MIME файла, но не исходное имя файла. Это до меня, чтобы на самом деле создать имя файла и расширение, прежде чем нажать Файл до S3. Есть ли библиотека или удобный способ определить соответствующее расширение для использования из типа MIME?

Я видел некоторые ссылки на библиотеку Apache Tika, но это кажется излишним, и я не смог чтобы получить его, чтобы успешно обнаружить расширения файлов еще. Из того, что я смог собрать, кажется, что этот код должен работать, но я просто получаю пустую строку, когда моя переменная типа "image/jpeg"

    MimeType mimeType = null;
    try {
        mimeType = new MimeTypes().forName(type);
    } catch (MimeTypeException e) {
        Logger.error("Couldn't Detect Mime Type for type: " + type, e);
    }

    if (mimeType != null) {
        String extension = mimeType.getExtension();
        //do something with the extension
    }

1 ответов


Как отметили некоторые комментаторы, нет универсального сопоставления 1:1 между типами и расширениями файлов... Некоторые типы имеют более одного возможного расширения, многие расширения совместно используются несколькими типами, а некоторые типы не имеют расширения.

там, где это возможно, вам гораздо лучше хранить тип mimetype и использовать его в будущем и забыть о расширении.

тем не менее, если вы хотите получить наиболее распространенное расширение файла для данного типа, то Тика является хорошим способом пойти. Apache Tika имеет очень большой набор миметипов, о которых он знает, и для многих из них он также знает MIME magic для обнаружения, общих расширений, описаний и т. д.

Если вы хотите получить наиболее распространенное расширение для файла JPEG, то как показано в этот модульный тест Apache TIKA вам просто нужно сделать что-то вроде:

  MimeTypes allTypes = MimeTypes.getDefaultMimeTypes();
  MimeType jpeg = allTypes.forName("image/jpeg");
  String jpegExt = jpeg.getExtension(); // .jpg
  assertEquals(".jpg", jpeg.getExtension());

главное, что вам нужно загрузить xml-файл, который в комплекте в тика банку, чтобы получить определения всех типов миметиков. Если вы также имеете дело с пользовательскими типами mimetypes, то Tika поддерживает их, и измените строку один на:

  TikaConfig config = TikaConfig.getDefaultConfig();
  MimeTypes allTypes = config.getMimeRepository();

используя метод TikaConfig для получения типов MimeTypes, Tika также проверит ваш путь к классам для пользовательских определений типов mimetype и включит их.