为了根据文件内容(而不是扩展名)检测真正的文件类型,我使用apache Tika。
我写了以下代码:
InputStream theInputStream = new FileInputStream("D:\video.mp4");
try (InputStream is = theInputStream;
BufferedInputStream bis = new BufferedInputStream(is);) {
AutoDetectParser parser = new AutoDetectParser();
Detector detector = parser.getDetector();
Metadata md = new Metadata();
MediaType mediaType = detector.detect(bis, md);
mediaType.getBaseType().compareTo(MediaType))
System.out.println(mediaType);
}
此代码输出image/jpeg
。
这是真的,因为我更改了文件扩展名。
现在我要检查文件是否为image。
我在MediaType类中找不到enum。
现在我只知道以下方法:
mediaType.toString().startsWith("image");
但是这段代码看起来很丑。
你能提出更好的解决办法吗?
您将看到MediaType
具有getType()
和getSubtype()
方法。您要查找的是类型(即。"image/*"
)。子类型在本例中是"jpeg"
。
所以你的测试应该是:
if (mediaType.getType().equals("image")) {
// Deal with image
}
如果文件是真正的gif, png或任何文件,那么唯一可靠的检查方法是检查这些文件中每个文件具有的独特的"魔术"字节序列。
如果你正在使用Java 7,你可以去这里的解决方案:https://odoepner.wordpress.com/2013/07/29/transparently-improve-java-7-mime-type-recognition-with-apache-tika/
我不是这个的作者,也没有测试过!