【问题标题】:Adding Mimetypes to MimetypesFileTypeMap将 Mimetypes 添加到 MimetypesFileTypeMap
【发布时间】: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 类型文件:

  1. 以编程方式将条目添加到 MimetypesFileTypeMap 实例。
  2. 用户主目录中的文件.mime.types
  3. 文件<java.home>/lib/mime.types
  4. 名为META-INF/mime.types的文件或资源。
  5. 名为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


【解决方案1】:

Spring 提供了a wrapper class,其中包含更新的 MIME 类型列表。您使用它的方式与使用 MimetypesFileTypeMap 几乎相同。

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

【讨论】:

  • 对于 X.png 文件,它返回 image/x-png ,但它需要返回 image/png。我认为现在不正确。
【解决方案2】:

回答 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。

【讨论】:

  • 好电话。这里的结果大致相同(相同的 Jar)。
  • opps,我忘记发布我的环境:java 版本“1.6.0_22”Java(TM) SE 运行时环境(构建 1.6.0_22-b04)Java HotSpot(TM) 64 位服务器 VM(构建 17.1-b03,混合模式)
  • 注意,如果您使用的是 Java 7,则此文件丢失。见错误bugs.openjdk.java.net/browse/JDK-7096063
【解决方案3】:

您可以在 Javacode 中向 MimetypesFileTypeMap 添加一个 mimetype

MimetypesFileTypeMap mimeType = new MimetypesFileTypeMap();
mimeType.addMimeTypes("application/pdf pdf");

这里的关键信息是 addMimeTypes 参数必须是 "mime_type extension" eg: "application/pdf pdf" 如上图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-19
    • 2010-12-18
    • 1970-01-01
    • 2018-07-17
    • 2013-06-04
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多