如何在Java 6中从字节数组中获取MIME类型?

11

我一直在尝试找出如何从Java 6的字节数组中获取MIME类型,但不幸的是,我还没有成功获取MIME类型。

有人能帮助我解决这个问题吗?


1
byte[] 包含 MIME 类型?请提供更详细(更多!)的信息。并且请给出一些源代码示例。 - Jan
3个回答

23
你可以使用Java 6提供的MimetypesFileTypeMap类。这个类专门用于获取MIME类型。如下所示,使用它来获取MIME类型:
byte[] content = ;
InputStream is = new BufferedInputStream(new ByteArrayInputStream(content));
String mimeType = URLConnection.guessContentTypeFromStream(is);

要从文件中获取数据,您可以使用以下代码:

MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();
String mime = mimeTypesMap.getContentType(file);

1
在现代Java(11)中,您必须将InputStream is = new BufferedInputStream更改为BufferedInputStream is = new BufferedInputStream,因为InputStream具有.markSupported() == false,因此mimeType始终为null,而缓冲版本具有.markSupported() == true - Samuel Prevost
它作为标准提供,但支持的MIME类型非常有限。例如,它无法识别PDF文件。因此,在一般计算用途上并不实用。 - Torben

1

Apache Tika library 在我的测试中证明是最准确的,可以从字节数组中检测出正确的 MIME 类型,比 Java 的 URLConnection.guessContentTypeFromStream() 要好得多,后者在我的测试中并不可靠。


0
良好的工作库https://github.com/overview/mime-types 导入方式(通过gradle.kts):
implementation("org.overviewproject:mime-types:0.1.3")

用法

// input
final var fileName = "somefile.html";
final var content = "<html></html>".getBytes();

final var mimeTypeDetector = new MimeTypeDetector(); // initialize only once, reuse!
final var mimeType = mimeTypeDetector.detectMimeType(fileName, () -> content);

System.out.println(mimeType); // prints: text/html

代码片段使用了Java 10的特性。很容易降级! - MrSpock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接