Java 将Mimetypes添加到MimetypesFileTypeMap

Java 将Mimetypes添加到MimetypesFileTypeMap,java,mime-types,Java,Mime Types,将Mimetypes添加到MimetypesFileTypeMap时遇到问题。我试着添加META-INF/mime.types文件,就像上面所说的那样。但它似乎并没有被MimetypesFileTypeMap读取 import org.springframework.mail.javamail.ConfigurableMimeFileTypeMap; ... ConfigurableMimeFileTypeMap mimeMap = new ConfigurableMimeFileTypeMap

将Mimetypes添加到MimetypesFileTypeMap时遇到问题。我试着添加META-INF/mime.types文件,就像上面所说的那样。但它似乎并没有被MimetypesFileTypeMap读取

import org.springframework.mail.javamail.ConfigurableMimeFileTypeMap;
...
ConfigurableMimeFileTypeMap mimeMap = new ConfigurableMimeFileTypeMap();
String contentType = mimeMap.getContentType(uploadedName);//defaults to application/octet-stream
我错过什么了吗

这是一个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)
  • (A)如所示,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
    、没有
    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 . . .
    
    也就是说,两个文件上的
    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
    

    使用ClassLoader.getResource()加载默认的mimetype。

    您可以在Java代码中将mimetype添加到MimetypesFileTypeMap中

    MimetypesFileTypeMap mimeType = new MimetypesFileTypeMap();
    mimeType.addMimeTypes("application/pdf pdf");
    
    此处的关键信息是addMimeTypes参数必须为
    “mime_type extension”如上图所示:“application/pdf pdf”。

    N.B.我添加了“甚至更奇怪的边点…”之后的所有内容,因为我认为这与OP的问题密切相关。查看后,看起来MimetypesFileTypeMap依赖ClassLoader.getSystemResource加载文件。因此,问题可能与资源不在类路径中有关。不幸的是,我今天没有时间调查这件事了。再见。这里的结果基本相同(相同的Jar)。哎呀,我忘了发布我的环境:java版本“1.6.0_22”java(TM)SE运行时环境(build 1.6.0_22-b04)java热点(TM)64位服务器VM(build 17.1-b03,混合模式)注意,如果您使用的是java 7,那么这个文件将丢失。有关X.png文件,请参见bug。它返回image/X-png,但需要返回image/png。我认为现在这是不正确的。