如何从Java中的MIME类型确定适当的文件扩展名

rph*_*son 29 java amazon-s3 apache-tika

我正在将文件上传到Amazon s3存储桶,并且可以访问InputStream和包含文件的MIME类型但不包含原始文件名的String.在将文件推送到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
    }
Run Code Online (Sandbox Code Playgroud)

Gag*_*arr 51

正如一些评论家指出的那样,mimetypes和文件扩展名之间没有通用的1:1映射......一些mimetypes有多个可能的扩展名,许多扩展名由多个mimetypes共享,而一些mimetypes没有扩展名.

只要有可能,你最好存储mimetype并使用它,并忘记扩展.

也就是说,如果你想获得给定mimetype的最常见的文件扩展名,那么Tika是一个很好的方法.Apache Tika有一个非常大的mimetypes它知道,并且对于其中许多mimetypes它也知道mime魔法用于检测,常见扩展,描述等.

如果您想获得JPEG文件的最常见扩展名,那么如此Apache Tika单元测试所示,您只需执行以下操作:

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

关键是你需要加载捆绑在Tika jar中的xml文件来获取所有mimetypes的定义.如果您也可能正在处理自定义mimetypes,那么Tika支持这些,并将第一行更改为:

  TikaConfig config = TikaConfig.getDefaultConfig();
  MimeTypes allTypes = config.getMimeRepository();
Run Code Online (Sandbox Code Playgroud)

通过使用TikaConfig方法获取MimeTypes,Tika还将检查您的类路径以获取自定义mimetype定义,并包含这些定义.