将Mimetypes添加到MimetypesFileTypeMap
我在将Mimetypes添加到MimetypesFileTypeMap时遇到了麻烦。 我已经尝试添加一个META-INF / mime.types文件,就像文档说的那样。 但它似乎没有被MimetypesFileTypeMap读取。
我错过了什么吗?
这是一个Spring / Maven Web项目。 任何帮助,将不胜感激!
更奇怪的是侧面点。 一位路人(Andrew T.)前几天正在对MIME类型进行一些调查,并在MimetypesFileTypeMap
JavaDocs中发现了这个文档。
MIME类型文件搜索顺序:
MimetypesFileTypeMap
在用户系统的各个位置查找MIME类型文件条目。 当请求在MimetypesFileTypeMap
搜索MIME类型时,它按以下顺序搜索MIME类型文件:
- 以编程方式将条目添加到
MimetypesFileTypeMap
实例。 - 用户主目录中的文件
.mime.types
。 - 文件
/lib/mime.types
。 - 名为
META-INF/mime.types
的文件或资源。 - 名为
META-INF/mimetypes.default
的文件或资源(通常仅在activation.jar
文件中找到)。 (一个)
(A)正如jwrobel发布的代码所示 ,Jar实际上似乎是至少两个系统(使用JDK)的resources.jar
。
所以给这个来源..
import java.io.File; import javax.activation.MimetypesFileTypeMap; class TestMime { public static void main(String[] args) { System.out.println(System.getProperty("java.version")); File f = new File(System.getProperty("java.home"), "lib"); f = new File(f, "mime.types"); System.out.println(f.exists() + " \t - " +f); f = new File(System.getProperty("user.home"), ".mime.types"); System.out.println(f.exists() + " \t - " +f); MimetypesFileTypeMap mfm = new MimetypesFileTypeMap(); System.out.println(mfm.getContentType("a.js")); System.out.println(mfm.getContentType("a.png")); System.out.println(mfm.getContentType("a.jpg")); System.out.println(mfm.getContentType("a.au")); System.out.println(mfm.getContentType("a.htm")); } }
..我们可以排除’1′ – 以编程方式添加。 如果我们从没有META-INF
的目录中的命令行运行它,我们也可以忘记4和5,类路径上没有activation.jar
。 其中只留下选项2和3。
然而,这个来源的输出是……
1.6.0 false - C:\Program Files\Java\jdk1.6.0\jre\lib\mime.types false - C:\Users\Andrew\.mime.types application/octet-stream application/octet-stream image/jpeg audio/basic text/html Press any key to continue . . .
IE两个文件的false
结果可能是为文件字符串显示的MIME映射的来源,建议最后两个信息源。 不存在 那么来自哪里的信息呢?
Spring提供了一个包装类 ,它包含一个更新的MIME类型列表。 您使用它的方式与使用MimetypesFileTypeMap的方式非常相似。
import org.springframework.mail.javamail.ConfigurableMimeFileTypeMap; ... ConfigurableMimeFileTypeMap mimeMap = new ConfigurableMimeFileTypeMap(); String contentType = mimeMap.getContentType(uploadedName);//defaults to application/octet-stream
为了回答Andrew Thompson,我认为MimetypesFileTypeMap从/lib/resources.jar:/META-INF/mimetypes.default获取其默认的MIME类型定义。
从命令行运行此代码:
ClassLoader loader = Thread.currentThread().getContextClassLoader(); URL resource = loader.getResource("META-INF/mimetypes.default"); System.out.println(resource.getPath());
收益率 :
file:/usr/java/jdk1.6.0_22/jre/lib/resources.jar!/META-INF/mimetypes.default
MimetypesFileTypeMap使用ClassLoader.getResource()来加载默认的mimetypes。