【发布时间】:2011-09-12 13:58:52
【问题描述】:
我在将 Mimetypes 添加到 MimetypesFileTypeMap 时遇到问题。我试过像Documentation 所说的那样添加一个 META-INF/mime.types 文件。但它似乎没有被 MimetypesFileTypeMap 读取。
我错过了什么吗?
这是一个 Spring/Maven Web 项目。任何帮助将不胜感激!
更奇怪的一面。一位路人(Andrew T.)前几天正在对 MIME 类型进行一些调查,并在 MimetypesFileTypeMap JavaDocs 中发现了此文档。
MIME 类型文件搜索顺序:
MimetypesFileTypeMap 在用户系统的不同位置查找 MIME 类型的文件条目。当请求在MimetypesFileTypeMap 中搜索 MIME 类型时,它会按以下顺序搜索 MIME 类型文件:
- 以编程方式将条目添加到
MimetypesFileTypeMap实例。 - 用户主目录中的文件
.mime.types。 - 文件
<java.home>/lib/mime.types。 - 名为
META-INF/mime.types的文件或资源。 - 名为
META-INF/mimetypes.default的文件或资源(通常仅在activation.jar文件中找到)。 (A)
(A) 正如code posted by jwrobel 所证明的那样,在至少两个系统(使用JDK)上,Jar 实际上似乎是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、没有activation.jar 的目录中运行它,我们也可以忘记 4 和 5。只剩下选项 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 . . .
I.E.两个文件上的 false 结果可能是为文件字符串显示的 MIME 映射的来源,建议最后两个信息来源。不存在。那么这些信息到底是从哪里来的呢?
【问题讨论】:
-
注:我添加了“甚至更奇怪的侧点..”之后的所有内容,因为我认为它与 OP 的问题密切相关。
-
在查看 source for MimetpesFileTypeMap 之后,看起来 MimetypesFileTypeMap 依赖于 ClassLoader.getSystemResource 来加载文件。因此,问题可能与不在类路径中的资源有关。不幸的是,我今天没有时间研究这个了。
标签: java mime-types