@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface PermitFileCategory {
FileCategoryEnum[] value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface PermitFileType {
FileTypeEnum[] value();
}
public enum FileCategoryEnum {
PICS("图片", FileTypeUtils.PICS),
DOCS("文档", FileTypeUtils.DOCS),
VIDEOS("视频", FileTypeUtils.VIDEOS),
TORRENT("种子", FileTypeUtils.TORRENT),
AUDIOS("音乐", FileTypeUtils.AUDIOS),
OTHERS("其他", FileTypeUtils.OTHERS),
;
private String desc;
private FileTypeEnum[] fileTypeEnums;
FileCategoryEnum(String desc, FileTypeEnum[] fileTypeEnums) {
this.desc = desc;
this.fileTypeEnums = fileTypeEnums;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public FileTypeEnum[] getFileTypeEnums() {
return fileTypeEnums;
}
public void setFileTypeEnums(FileTypeEnum[] fileTypeEnums) {
this.fileTypeEnums = fileTypeEnums;
}
}
public enum FileTypeEnum {
JPEG("FFD8FF", ".jpeg"),
PNG("89504E47", ".png"),
GIF("47494638", ".gif"),
TIFF("49492A00", ".tif"),
BMP("424D", ".bmp"),
DWG("41433130", ".dwg"),
PSD("38425053", ".psd"),
RTF("7B5C727466", ".rtf"),
XML("3C3F786D6C", ".xml"),
HTML("68746D6C3E", ".html"),
CSS("48544D4C207B0D0A0942", ".css"),
JS("696B2E71623D696B2E71", ".js"),
EML("44656C69766572792D646174653A", ".eml"),
DBX("CFAD12FEC5FD746F", ".dbx"),
PST("2142444E", ".pst"),
XLS("D0CF11E0", ".xls"),
DOC("D0CF11E0", ".doc"),
PPT("D0CF11E0", ".ppt"),
XLSX("504B0304", ".xlsx"),
DOCX("504B0304", ".docx"),
PPTX("504B0304", ".pptx"),
VSD("d0cf11e0a1b11ae10000", ".vsd"),
MDB("5374616E64617264204A", ".mdb"),
WPS("d0cf11e0a1b11ae10000", ".wps"),
TORRENT("6431303A637265617465", ".torrent"),
WPD("FF575043", ".wpd"),
EPS("252150532D41646F6265", ".eps"),
PDF("255044462D312E", ".pdf"),
QDF("AC9EBD8F", ".qdf"),
PWL("E3828596", ".pwl"),
ZIP("504B0304", ".zip"),
RAR("52617221", ".rar"),
JSP("3C2540207061676520", ".jsp"),
JAVA("7061636B61676520", ".java"),
CLASS("CAFEBABE0000002E00", ".class"),
JAR("504B03040A000000", ".jar"),
MF("4D616E69666573742D56", ".mf"),
EXE("4D5A9000030000000400", ".exe"),
CHM("49545346030000006000", ".chm"),
WAV("57415645", ".wav"),
AVI("41564920", ".avi"),
RAM("2E7261FD", ".ram"),
RM("2E524D46", ".rm"),
RMVB("2E524D46000000120001", ".rmvb"),
MPG("000001BA", ".mpg"),
MOV("6D6F6F76", ".mov"),
ASF("3026B2758E66CF11", ".asf"),
MID("4D546864", ".mid"),
MP4("00000020667479706973", ".mp4"),
MP3("49443303000000002176", ".mp3"),
TXT("TXT----TXT", ".txt"),
FLV("464C5601050000000900", ".flv");
private String value;
private String fileNameSuffix;
FileTypeEnum(String value, String fileNameSuffix) {
this.value = value;
this.fileNameSuffix = fileNameSuffix;
}
public static FileTypeEnum getFileTypeEnum(String value) {
if (StringUtils.isEmpty(value)) {
return null;
}
for (FileTypeEnum fileTypeEnum : FileTypeEnum.values()) {
if (fileTypeEnum.getValue().equalsIgnoreCase(value)) {
return fileTypeEnum;
}
}
return null;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getFileNameSuffix() {
return fileNameSuffix;
}
public void setFileNameSuffix(String fileNameSuffix) {
this.fileNameSuffix = fileNameSuffix;
}
}
public class FileTypeUtils {
private static final Logger logger = LoggerFactory.getLogger(FileTypeUtils.class);
public static final FileTypeEnum[] PICS = {FileTypeEnum.JPEG, FileTypeEnum.PNG, FileTypeEnum.GIF, FileTypeEnum.TIFF, FileTypeEnum.BMP, FileTypeEnum.DWG, FileTypeEnum.PSD};
public static final FileTypeEnum[] DOCS = {FileTypeEnum.RTF, FileTypeEnum.XML, FileTypeEnum.HTML, FileTypeEnum.CSS, FileTypeEnum.JS, FileTypeEnum.EML, FileTypeEnum.DBX, FileTypeEnum.PST, FileTypeEnum.XLS, FileTypeEnum.DOC, FileTypeEnum.XLSX, FileTypeEnum.DOCX, FileTypeEnum.VSD,
FileTypeEnum.MDB, FileTypeEnum.WPS, FileTypeEnum.WPD, FileTypeEnum.EPS, FileTypeEnum.PDF, FileTypeEnum.QDF, FileTypeEnum.PWL, FileTypeEnum.ZIP, FileTypeEnum.RAR, FileTypeEnum.JSP, FileTypeEnum.JAVA, FileTypeEnum.CLASS,
FileTypeEnum.JAR, FileTypeEnum.MF, FileTypeEnum.EXE, FileTypeEnum.CHM, FileTypeEnum.PPTX, FileTypeEnum.PPT, FileTypeEnum.TXT};
public static final FileTypeEnum[] VIDEOS = {FileTypeEnum.AVI, FileTypeEnum.RAM, FileTypeEnum.RM, FileTypeEnum.RMVB, FileTypeEnum.MPG, FileTypeEnum.MOV, FileTypeEnum.ASF, FileTypeEnum.MP4, FileTypeEnum.FLV, FileTypeEnum.MID};
public static final FileTypeEnum[] TORRENT = {FileTypeEnum.TORRENT};
public static final FileTypeEnum[] AUDIOS = {FileTypeEnum.WAV, FileTypeEnum.MP3};
public static final FileTypeEnum[] OTHERS = {};
private static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder();
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
private static String getFileHead(InputStream is) {
byte[] b = new byte[28];
try {
is.read(b, 0, 28);
} catch (IOException e) {
logger.error("读取文件头失败", e);
return null;
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
logger.error("关闭文件流失败", e);
return null;
}
}
}
return bytesToHexString(b);
}
public static @Nullable FileTypeEnum getFileType(InputStream is) {
List<FileTypeEnum> fileTypeEnumList = getFileTypes(is);
if (!CollectionUtils.isEmpty(fileTypeEnumList)) {
return fileTypeEnumList.get(0);
}
return null;
}
public static @Nullable List<FileTypeEnum> getFileTypes(InputStream is) {
String fileHead = getFileHead(is);
if (StringUtils.isEmpty(fileHead)) {
return null;
}
fileHead = fileHead.toUpperCase();
List<FileTypeEnum> fileTypeEnumList = new ArrayList<>();
for (FileTypeEnum fileTypeEnum : FileTypeEnum.values()) {
if (fileHead.startsWith(fileTypeEnum.getValue())) {
fileTypeEnumList.add(fileTypeEnum);
}
}
return fileTypeEnumList;
}
@Deprecated
public static @Nullable String obtainFileNameSuffix(InputStream is) {
if (is != null) {
FileTypeEnum fileTypeEnum = getFileType(is);
if (fileTypeEnum != null) {
return fileTypeEnum.getFileNameSuffix();
}
}
return null;
}
public static @Nullable String obtainFileNameSuffix(InputStream is, String defaultFileNameSuffix) {
if (is != null) {
List<FileTypeEnum> fileTypeEnumList = getFileTypes(is);
if (!CollectionUtils.isEmpty(fileTypeEnumList)) {
for (FileTypeEnum fileTypeEnum : fileTypeEnumList) {
if (StringUtils.isNotEmpty(defaultFileNameSuffix) && fileTypeEnum.getFileNameSuffix().equalsIgnoreCase(defaultFileNameSuffix)) {
return fileTypeEnum.getFileNameSuffix();
}
}
return fileTypeEnumList.get(0).getFileNameSuffix();
}
}
return null;
}
public static @Nullable FileTypeEnum obtainFileTypeEnum(InputStream is, String defaultFileNameSuffix) {
if (is != null) {
List<FileTypeEnum> fileTypeEnumList = getFileTypes(is);
if (!CollectionUtils.isEmpty(fileTypeEnumList)) {
for (FileTypeEnum fileTypeEnum : fileTypeEnumList) {
if (StringUtils.isNotEmpty(defaultFileNameSuffix) && fileTypeEnum.getFileNameSuffix().equalsIgnoreCase(defaultFileNameSuffix)) {
return fileTypeEnum;
}
}
return fileTypeEnumList.get(0);
}
}
return null;
}
public static Boolean isPic(FileTypeEnum fileTypeEnum) {
if (fileTypeEnum == null) {
return false;
}
for (FileTypeEnum picEnum : PICS) {
if (picEnum.equals(fileTypeEnum)) {
return true;
}
}
return false;
}
public static Boolean isFileTypeEnum(FileTypeEnum[] fileTypeEnums, FileTypeEnum fileTypeEnum) {
if (fileTypeEnum == null || fileTypeEnums == null) {
return false;
}
for (FileTypeEnum picEnum : fileTypeEnums) {
if (picEnum.equals(fileTypeEnum)) {
return true;
}
}
return false;
}
public static Boolean isFileCategoryEnum(FileCategoryEnum oriFileCategoryEnum, FileTypeEnum fileTypeEnum) {
if (fileTypeEnum == null || oriFileCategoryEnum == null) {
return false;
}
FileCategoryEnum fileCategoryEnum = getFileCategoryEnum(fileTypeEnum);
if (fileCategoryEnum != null && fileCategoryEnum.equals(oriFileCategoryEnum)) {
return true;
}
return false;
}
public static FileCategoryEnum getFileCategoryEnum(FileTypeEnum fileTypeEnum) {
if (fileTypeEnum == null) {
return null;
}
if (isFileTypeEnum(FileCategoryEnum.PICS.getFileTypeEnums(), fileTypeEnum)) {
return FileCategoryEnum.PICS;
}
if (isFileTypeEnum(FileCategoryEnum.DOCS.getFileTypeEnums(), fileTypeEnum)) {
return FileCategoryEnum.DOCS;
}
if (isFileTypeEnum(FileCategoryEnum.VIDEOS.getFileTypeEnums(), fileTypeEnum)) {
return FileCategoryEnum.VIDEOS;
}
if (isFileTypeEnum(FileCategoryEnum.TORRENT.getFileTypeEnums(), fileTypeEnum)) {
return FileCategoryEnum.TORRENT;
}
if (isFileTypeEnum(FileCategoryEnum.AUDIOS.getFileTypeEnums(), fileTypeEnum)) {
return FileCategoryEnum.AUDIOS;
}
return FileCategoryEnum.OTHERS;
}
}