ImageIO判断图片类型
ImageInputStream image = ImageIO.createImageInputStream(in);
Iterator<ImageReader> readers = ImageIO.getImageReaders(image);
readers.next().getFormatName();
JDK内置了下面类型的ImageReader:
图像类型 | 扩展名 | MIME类型 | 魔数(十六进制) | 魔数(ASCII) |
---|---|---|---|---|
gif | gif | image/gif | 474946373961 | GIF79a |
bmp | bmp | image/bmp | 424d | BM |
wbmp | wbmp | image/vnd.wap.wbmp | 判断很复杂 | |
png | png | image/png、image/x-png | 89504e470d0a1a0a | �PNG |
jpg、jpeg | jpg、jpeg | image/jpeg | ffd8 | �� |
webp | webp | image/webp | 52494646{4字节文件大小}574542505650382056503858 | RIFF{4字节文件大小}WEBPVP8 VP8X |
我们可以通过JNI + ServiceLoader支持新的文件类型,参考Webp扩展:Web-imageio
Files判断文件类型
public class Files {
...
public static String probeContentType(Path path) {
...
}
...
}
通过FileTypeDetector进行文件类型的检测,可能是只检查文件名称、或者检查文件属性或者文件的字节,但是目前看java中只实现了检查文件名称的方式,还需要在${user.home}/.mime.types中配置扩展名到mime type的映射.
通过Linux的工具file
file --mime-type <待判断的文件>
file -m <magic文件或者目录> --mime-type <待判断的文件>
该工具通过解析文件内容来判断文件的真实类型,我们可以通过Java Runtime工具来对该工具实现调用。
该工具依赖于/usr/share/file/magic.mgc
文件或者/usr/share/file/magic
目录,magic文件里定义了文件类型判断的规则,注意不同版本的file工具的magic文件可能存在不兼容的情况。