如何使用Java从文件中获得媒体类型(MIME类型)?到目前为止,我已经尝试了JMimeMagic和Mime-Util。第一个给了我内存异常,第二个没有正确地关闭它的流。

您将如何探测该文件以确定其实际类型(而不仅仅是基于扩展名)?


当前回答

最好使用两层验证文件上传。

首先,您可以检查mimeType并验证它。

其次,您应该考虑将文件的前4个字节转换为十六进制,然后将其与神奇的数字进行比较。然后,这将是一种非常安全的检查文件验证的方法。

其他回答

从roseindia:

FileNameMap fileNameMap = URLConnection.getFileNameMap();
String mimeType = fileNameMap.getContentTypeFor("alert.gif");

如果你是一个Android开发人员,你可以使用一个工具类Android .webkit. mimetypemap,它将mime类型映射到文件扩展名,反之亦然。下面的代码片段可能对您有所帮助。 getMimeType(String fileUrl) { 字符串扩展= MimeTypeMap.getFileExtensionFromUrl(fileUrl); 返回MimeTypeMap.getSingleton () .getMimeTypeFromExtension(扩展); }

Apache Tika在Tika -core中提供了基于流前缀中的魔法标记的mime类型检测。tika-core不获取其他依赖项,这使得它像目前未维护的Mime类型检测实用程序一样轻量级。

简单的代码示例(Java 7),使用变量theInputStream和theFileName

try (InputStream is = theInputStream;
        BufferedInputStream bis = new BufferedInputStream(is);) {
    AutoDetectParser parser = new AutoDetectParser();
    Detector detector = parser.getDetector();
    Metadata md = new Metadata();
    md.add(Metadata.RESOURCE_NAME_KEY, theFileName);
    MediaType mediaType = detector.detect(bis, md);
    return mediaType.toString();
}

请注意,meditype .detect(…)不能直接使用(TIKA-1120)。更多提示请访问https://tika.apache.org/1.24/detection.html。

用我的5分钱凑钱:

TL,博士

我使用MimetypesFileTypeMap,并添加任何mime,不存在,我特别需要它,到mime。类型文件。

现在,长长的一段是:

首先,MIME类型列表是巨大的,请看这里:https://www.iana.org/assignments/media-types/media-types.xhtml

我喜欢首先使用JDK提供的标准工具,如果这不起作用,我将去寻找其他工具。

根据文件扩展名确定文件类型

从1.6开始,Java就有了MimetypesFileTypeMap,正如上面的答案之一所指出的,它是确定mime类型的最简单方法:

new MimetypesFileTypeMap().getContentType( fileName );

在它的香草实现中,这并没有做太多(即它适用于。html,但不适用于。png)。然而,添加任何你可能需要的内容类型是超级简单的:

创建名为'mime '的文件。在项目的META-INF文件夹中 为你需要的每一种mime类型添加一行,默认实现没有提供(有数百种mime类型,并且列表会随着时间的推移而增长)。

png和js文件的示例条目如下:

image/png png PNG
application/javascript js

哑剧演员。类型文件格式,查看更多详细信息:https://docs.oracle.com/javase/7/docs/api/javax/activation/MimetypesFileTypeMap.html

根据文件内容确定文件类型

从1.7开始,Java有Java .nio.file.spi。FileTypeDetector,它定义了一个标准API,用于以特定于实现的方式确定文件类型。

为了获取文件的mime类型,你可以简单地使用Files并在你的代码中这样做:

Files.probeContentType(Paths.get("either file name or full path goes here"));

API定义提供了支持从文件名或文件内容(魔术字节)确定文件mime类型的工具。这就是为什么probeContentType()方法抛出IOException,以防该API的实现使用提供给它的Path来实际尝试打开与它相关的文件。

同样,此功能的普通实现(JDK附带的实现)还有很多需要改进的地方。

在遥远的银河系中的某个理想世界中,所有试图解决文件到mime类型问题的库都将简单地实现java.nio.file.spi。filettypedetector,您可以将首选实现库的jar文件放到类路径中,这就是它了。

在现实世界中,当你需要TL和DR部分时,你应该找到在它的名字旁边有最多星星的库并使用它。对于这个特定的情况,我不需要(还;))。

实际上,Apache Tika检测器Tika.detect(File)是最好的选择,比Files.probeContentType(path)更准确。

检查这个伟大的快速参考包含示例和代码示例。