公共代码片段:
String truePath ="D:/ctsi/uploadPath/证件."; //没有后缀名称的文件(其实是一个图片)
File file =new File(truePath);
FileInputStream fileInputStream = new FileInputStream(truePath);
一、jMimeMagic 方式获取
jMimeMagic
是一个受限制许可的库,我们可以使用它来获取文件的MIME类型。该库可以处理数据流,因此不需要文件存在于文件系统中。
需要的依赖:
<dependency>
<groupId>net.sf.jmimemagic</groupId>
<artifactId>jmimemagic</artifactId>
<version>0.1.5</version>
</dependency>
代码:
MagicMatch match = Magic.getMagicMatch(file,false);
String mimeType1 = match.getMimeType();
System.out.println(mimeType1);
二、使用Apache TikaApache Tika
是一个工具集,可检测并从各种文件中提取元数据和文本。它具有丰富而强大的API,并带有[tika-core],我们可以利用它来检测文件的MIME类型。
需要的依赖:
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>1.18</version>
</dependency>
代码:
Tika tika =new Tika();
String mimeType2 = tika.detect(file);
System.out.println(mimeType2);
三、使用getContentType
此方式不需要依赖,使用的是JDK中的方法,不过现已经过时,方法仍可用,但此方法效率有些慢
代码:
URLConnection connection = file.toURL().openConnection();
String mimeType3 = connection.getContentType();
总结:
上面三种方法均是根据获取的文件流中前几个字符来判断文件的类型,可正确获取到实际的文件类型,即便是本地保存的文件名称不对,也可获取到正确的类型。
以上均支持image和doc格式获取
文件类型 | 是否获取 |
---|---|
image | 是 |
doc | 是 |
四、使用guessContentTypeFromStream
在网上看到的是,这个方法也是通过获取文件流前面几个字符来判断文件类型,但是,我使用次方法未获取到**
file
**的文件类型。待定。。。
代码:
String mimeType4 = URLConnection.guessContentTypeFromName(file.getName());
文件类型 | 是否获取 |
---|---|
image | 是 |
doc | 否 |