package com.xjrsoft.config; import lombok.Getter; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Set; /** * 文件校验规则配置(优化版) */ @Getter public final class FileCheckRuleConfig { /* ========== 基础类型规则 ========== */ /** * 图片规则(严格模式) */ public static final FileCheckRuleConfig IMAGE = builder() .withExtensions("jpg", "jpeg", "png", "gif", "webp", "bmp") .withMimeTypes( "image/jpeg", "image/png", "image/gif", "image/webp", "image/bmp" ) .build(); /** * 视频规则 */ public static final FileCheckRuleConfig VIDEO = builder() .withExtensions("mp4", "mov", "avi", "wmv", "flv", "mkv") .withMimeTypes( "video/mp4", "video/quicktime", "video/x-msvideo", "video/x-ms-wmv", "video/x-flv", "video/x-matroska" ) .build(); /** * 音频规则 */ public static final FileCheckRuleConfig AUDIO = builder() .withExtensions("mp3", "wav", "aac", "flac", "ogg", "m4a") .withMimeTypes( "audio/mpeg", "audio/wav", "audio/aac", "audio/flac", "audio/ogg", "audio/x-m4a" ) .build(); /** * 文档规则 */ public static final FileCheckRuleConfig DOCUMENT = builder() .withExtensions("pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt") .withMimeTypes( "application/pdf", "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.presentationml.presentation", "text/plain" ) .build(); /* ========== 组合类型规则 ========== */ /** * 媒体规则(图片+视频) */ public static final FileCheckRuleConfig MEDIA = combine(IMAGE, VIDEO); /** * 图片和文档规则 */ public static final FileCheckRuleConfig IMAGE_AND_DOCUMENT = combine(IMAGE, DOCUMENT); /** * 所有类型规则 */ public static final FileCheckRuleConfig ALL = combine(IMAGE, VIDEO, AUDIO, DOCUMENT); private final Set allowedExtensions; private final Set allowedMimeTypes; private FileCheckRuleConfig(Builder builder) { this.allowedExtensions = Collections.unmodifiableSet(builder.extensions); this.allowedMimeTypes = Collections.unmodifiableSet(builder.mimeTypes); } /** * 创建新的构建器 */ public static Builder builder() { return new Builder(); } /** * 合并多个规则配置 */ public static FileCheckRuleConfig combine(FileCheckRuleConfig... configs) { Builder builder = builder(); for (FileCheckRuleConfig config : configs) { builder.extensions.addAll(config.allowedExtensions); builder.mimeTypes.addAll(config.allowedMimeTypes); } return builder.build(); } /** * 构建器类 */ public static final class Builder { private final Set extensions = new HashSet<>(); private final Set mimeTypes = new HashSet<>(); private Builder() { } public Builder withExtensions(String... extensions) { this.extensions.addAll(Arrays.asList(extensions)); return this; } public Builder withMimeTypes(String... mimeTypes) { this.mimeTypes.addAll(Arrays.asList(mimeTypes)); return this; } public Builder addExtension(String extension) { this.extensions.add(extension); return this; } public Builder addMimeType(String mimeType) { this.mimeTypes.add(mimeType); return this; } public Builder from(FileCheckRuleConfig config) { this.extensions.addAll(config.allowedExtensions); this.mimeTypes.addAll(config.allowedMimeTypes); return this; } public FileCheckRuleConfig build() { return new FileCheckRuleConfig(this); } } }