如何使用Java从文件中获得媒体类型(MIME类型)?到目前为止,我已经尝试了JMimeMagic和Mime-Util。第一个给了我内存异常,第二个没有正确地关闭它的流。
您将如何探测该文件以确定其实际类型(而不仅仅是基于扩展名)?
如何使用Java从文件中获得媒体类型(MIME类型)?到目前为止,我已经尝试了JMimeMagic和Mime-Util。第一个给了我内存异常,第二个没有正确地关闭它的流。
您将如何探测该文件以确定其实际类型(而不仅仅是基于扩展名)?
当前回答
public String getFileContentType(String fileName) {
String fileType = "Undetermined";
final File file = new File(fileName);
try
{
fileType = Files.probeContentType(file.toPath());
}
catch (IOException ioException)
{
System.out.println(
"ERROR: Unable to determine file type for " + fileName
+ " due to exception " + ioException);
}
return fileType;
}
其他回答
如果你想要一个可靠的。consistent)映射文件扩展名到mime类型的方法,下面是我使用的:
https://github.com/jjYBdx4IL/misc/blob/master/text-utils/src/main/java/com/github/jjYBdx4IL/utils/text/MimeType.java
它包括一个绑定的mime类型数据库,基本上颠倒了javax的逻辑。激活的MimetypesFileTypeMap类,通过使用数据库初始化“编程式”条目。这样,标准库定义的类型总是优先于未绑定资源中定义的类型。
在Java 7中,你现在可以只使用Files.probeContentType(path)。
实际上,Apache Tika检测器Tika.detect(File)是最好的选择,比Files.probeContentType(path)更准确。
检查这个伟大的快速参考包含示例和代码示例。
这是我发现的最简单的方法:
byte[] byteArray = ...
InputStream is = new BufferedInputStream(new ByteArrayInputStream(byteArray));
String mimeType = URLConnection.guessContentTypeFromStream(is);
在尝试了其他各种库之后,我最终选择了mime-util。
<groupId>eu.medsea.mimeutil</groupId>
<artifactId>mime-util</artifactId>
<version>2.1.3</version>
</dependency>
File file = new File("D:/test.tif");
MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
Collection<?> mimeTypes = MimeUtil.getMimeTypes(file);
System.out.println(mimeTypes);