将Mimetypes添加到MimetypesFileTypeMap

Jus*_*bel 12 java mime-types

我在将Mimetypes添加到MimetypesFileTypeMap时遇到了麻烦.我已经尝试添加META-INF/mime.types文件,就像文档说的那样.但它似乎没有被MimetypesFileTypeMap读取.

我错过了什么吗?

这是一个Spring/Maven Web项目.任何帮助,将不胜感激!


更奇怪的是侧面点.一位路人(Andrew T.)前几天正在对MIME类型进行一些调查,并在MimetypesFileTypeMapJavaDocs中发现了这个文档.


MIME类型文件搜索顺序:

MimetypesFileTypeMap对于MIME类型,在不同的地方看在用户的系统文件条目.当请求在MimetypesFileTypeMap其中搜索MIME类型时,它按以下顺序搜索MIME类型文件:

  1. 以编程方式向MimetypesFileTypeMap实例添加条目.
  2. 该文件.mime.types在用户的主目录.
  3. 该文件<java.home>/lib/mime.types.
  4. 名为的文件或资源META-INF/mime.types.
  5. 命名的文件或资源META-INF/mimetypes.default(通常只在activation.jar文件中找到).(一个)

(A)正如jwrobel发布代码所证明的那样,Jar实际上似乎是resources.jar至少两个系统(使用JDK).


所以给这个来源..

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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

..我们可以排除'1' - 以编程方式添加.如果我们从命令行运行它,我们也可以忘记4和5 META-INF,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 . . .
Run Code Online (Sandbox Code Playgroud)

IE false两个文件的结果可能是为文件字符串显示的MIME映射的来源,建议最后两个信息源.不存在 那么来自哪里的信息呢?

Jus*_*bel 12

Spring提供了一个包装类,它包含一个更新的MIME类型列表.您使用它的方式与使用MimetypesFileTypeMap的方式非常相似.

import org.springframework.mail.javamail.ConfigurableMimeFileTypeMap;
...
ConfigurableMimeFileTypeMap mimeMap = new ConfigurableMimeFileTypeMap();
String contentType = mimeMap.getContentType(uploadedName);//defaults to application/octet-stream
Run Code Online (Sandbox Code Playgroud)


Jus*_*bel 9

为了回答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());
Run Code Online (Sandbox Code Playgroud)

收益率:

file:/usr/java/jdk1.6.0_22/jre/lib/resources.jar!/META-INF/mimetypes.default
Run Code Online (Sandbox Code Playgroud)

MimetypesFileTypeMap 使用ClassLoader.getResource()来加载默认的mimetypes.