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

2022-09-01 04:22:47

我正在将文件上传到 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

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

只要有可能,你最好存储哑剧类型并使用它,然后忘记扩展。

也就是说,如果您确实想为给定的mimetype获取最常见的文件扩展名,那么Tika是一个很好的方法。Apache Tika有一组非常庞大的哑剧类型,对于其中许多,它也知道用于检测,常见扩展,描述等的哑剧魔术。

如果你想获得JPEG文件最常见的扩展名,那么如这个Apache Tika单元测试所示,你只需要做这样的事情:

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

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

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

通过使用 TikaConfig 方法获取 MimeTypes,Tika 还将检查您的类路径中是否有自定义 mimetype 定义,并包括这些定义。


答案 2

推荐