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

标签 java amazon-s3 apache-tika

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

最佳答案

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

只要有可能,最好先存储 mimetype 并继续使用它,然后忘记扩展。

也就是说,如果您确实想为给定的 mimetype 获取最常见的文件扩展名,那么 Tika 是一个不错的选择。 Apache Tika它知道大量的 mimetypes,并且对于其中许多它还知道 mime 魔法检测、常见扩展、描述等。

如果您想获得 JPEG 文件的最常见扩展名,则如 this Apache Tika unit test 所示您只需要执行以下操作:

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

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

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

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

关于java - 如何从 Java 中的 MIME 类型确定适当的文件扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13650372/

相关文章:

java - 用Java解析文档结构

java - 由于违反约束,节点 setProperty 在 Magnolia CMS 中给出 RepositoryException

python - 以多线程方式从 s3 (boto3) 读取文件

javascript - 如何在 Node js 中调整图像大小

java - 在 Solr 中存储 PDF

Python无法导入tika

java - Java 中的希伯来语编码

java - Android 长轮询聊天

java - 通过电子邮件上传照片(类似Posterous)

amazon-web-services - 如何将 Amazon AWS S3 中的 rel 规范添加到 pdf 文件