用非后缀名方式判断文件类型,文件格式,使用的业务场景不再详细描述了,直接上实现方法(使用者可以进行优化改造);
1、创建文件类型枚举:
package com.shsnc.dbtdemo.common.enums; /** * 文件类型枚举(部分为自定义类型) * * @author klp * @date 2022-06-24 */ public enum FileTypeEnum { /** * JEPG. */ JPEG("FFD8FF"), /** * PNG. */ PNG("89504E47"), /** * GIF. */ GIF("47494638"), /** * TIFF. */ TIFF("49492A00"), /** * RTF. */ RTF("7B5C727466"), /** * DOC */ DOC("D0CF11E0"), /** * XLS */ XLS("D0CF11E0"), /** * ACCESS */ MDB("5374616E64617264204A"), /** * WordPerfect */ WPD("FF575043"), /** * WordPerfect */ EPS("252150532D41646F6265"), /** * PS */ PS("252150532D41646F6265"), /** * Windows Bitmap. */ BMP("424D"), /** * CAD. */ DWG("41433130"), /** * Adobe Photoshop. */ PSD("38425053"), /** * Email [thorough only] */ EML("44656C69766572792D646174653A"), /** * XML. */ XML("3C3F786D6C"), /** * Outlook Express */ DBX("CFAD12FEC5FD746F"), /** * Outlook */ PST("2142444E"), /** * office类型,包括doc、xls和ppt */ OFFICE("D0CF11E0"), /** * HTML. */ HTML("68746D6C3E"), /** * Adobe Acrobat. */ PDF("255044462D312E"), /** * Quicken */ QDF("AC9EBD8F"), /** * Windows Password */ PWL("E3828596"), /** * ZIP Archive. */ ZIP("504B0304"), /** * RAR Archive. */ RAR("52617221"), /** * Wave. */ WAV("57415645"), /** * AVI. */ AVI("41564920"), /** * Real Audio */ RAM("2E7261FD"), /** * Real Media */ RM("2E524D46"), /** * MPG */ MPG("000001BA"), /** * Quicktime */ MOV("6D6F6F76"), /** * Windows Media */ ASF("3026B2758E66CF11"), /** * MIDI (mid) */ MID("4D546864"), /** * EXE */ EXE("4d5a"); private String value = ""; /** * Constructor. * * @param value */ private FileTypeEnum(String value) { this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
2、判断方法:
/** * 检查文件类型 * * @param inputStream * @return * @throws IOException */ public static boolean checkFileType(InputStream inputStream) throws IOException { byte[] b = new byte[28];//这里需要注意的是,每个文件的magic word的长度都不相同,因此需要使用startwith inputStream.read(b, 0, 28); inputStream.close(); String fileHead = bytes2hex(b); fileHead = fileHead.toUpperCase(); FileTypeEnum[] fileTypeEnums = FileTypeEnum.values(); for (FileTypeEnum type : fileTypeEnums) { if (fileHead.startsWith(type.getValue())) { return true; } } return false; }
/** * 二进制转化为16进制 */ private static String bytes2hex(byte[] bytes) { StringBuilder hex = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { String temp = Integer.toHexString(bytes[i] & 0xFF); if (temp.length() == 1) { hex.append("0"); } hex.append(temp.toLowerCase()); } return hex.toString(); }