如何从 Java 中的 MIME 类型确定适当的文件扩展名
Posted
技术标签:
【中文标题】如何从 Java 中的 MIME 类型确定适当的文件扩展名【英文标题】:How to determine appropriate file extension from MIME Type in Java 【发布时间】:2012-11-18 23:28:25 【问题描述】:我正在将文件上传到 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
【问题讨论】:
您确定需要设置文件扩展名吗?如果您知道 MIME 类型,则可以使用正确的Content-Type
将其上传到 S3,并且扩展名(通常)变得无关紧要。
你说得对,我刚刚检查过,在我的情况下,在 ObjectMetadata 中为 S3 设置 Content-Type 就可以解决问题。我还是想知道这个问题的答案,看来以后可以派上用场了。
很公平。 MIME 类型与文件扩展名之间没有一个 True Mapping™ —— 有些类型有多个扩展名,有些扩展名有多种类型 - 所以当我使用可以独立保存的数据存储时,我会尝试只存储我知道的内容并避免猜测。
【参考方案1】:
正如一些评论者所指出的,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 中的 MIME 类型确定适当的文件扩展名的主要内容,如果未能解决你的问题,请参考以下文章