FileCheckRuleConfig.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. package com.xjrsoft.config;
  2. import lombok.Getter;
  3. import java.util.Arrays;
  4. import java.util.Collections;
  5. import java.util.HashSet;
  6. import java.util.Set;
  7. /**
  8. * 文件校验规则配置(优化版)
  9. */
  10. @Getter
  11. public final class FileCheckRuleConfig {
  12. /* ========== 基础类型规则 ========== */
  13. /**
  14. * 图片规则(严格模式)
  15. */
  16. public static final FileCheckRuleConfig IMAGE = builder()
  17. .withExtensions("jpg", "jpeg", "png", "gif", "webp", "bmp","svg")
  18. .withMimeTypes(
  19. "image/jpeg",
  20. "image/png",
  21. "image/gif",
  22. "image/webp",
  23. "image/bmp",
  24. "image/svg+xml",
  25. "image/svg"
  26. )
  27. .build();
  28. /**
  29. * 视频规则
  30. */
  31. public static final FileCheckRuleConfig VIDEO = builder()
  32. .withExtensions("mp4", "mov", "avi", "wmv", "flv", "mkv")
  33. .withMimeTypes(
  34. "video/mp4",
  35. "video/quicktime",
  36. "video/x-msvideo",
  37. "video/x-ms-wmv",
  38. "video/x-flv",
  39. "video/x-matroska"
  40. )
  41. .build();
  42. /**
  43. * 音频规则
  44. */
  45. public static final FileCheckRuleConfig AUDIO = builder()
  46. .withExtensions("mp3", "wav", "aac", "flac", "ogg", "m4a")
  47. .withMimeTypes(
  48. "audio/mpeg",
  49. "audio/wav",
  50. "audio/aac",
  51. "audio/flac",
  52. "audio/ogg",
  53. "audio/x-m4a"
  54. )
  55. .build();
  56. /**
  57. * 文档规则
  58. */
  59. public static final FileCheckRuleConfig DOCUMENT = builder()
  60. .withExtensions(
  61. "pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt",
  62. // WPS 文件扩展名
  63. "wps", "et", "dps", "wpt", "ett", "dpt", "vsd", "vsdx",
  64. "ofd","xml"
  65. )
  66. .withMimeTypes(
  67. "application/pdf",
  68. "application/msword",
  69. "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
  70. "application/vnd.ms-excel",
  71. "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
  72. "application/vnd.ms-powerpoint",
  73. "application/vnd.openxmlformats-officedocument.presentationml.presentation",
  74. "text/plain",
  75. // WPS MIME 类型 - 补充更多可能的类型
  76. "application/vnd.ms-works",
  77. "application/wps-office.wps",
  78. "application/wps-office.et",
  79. "application/wps-office.dps",
  80. "application/wps-office.wpt",
  81. "application/wps-office.ett",
  82. "application/wps-office.dpt",
  83. "application/kswps",
  84. "application/kset",
  85. "application/ksdps",
  86. "application/x-wps",
  87. "application/x-et",
  88. "application/x-dps",
  89. "application/vnd.wps-office.wps",
  90. "application/vnd.wps-office.et",
  91. "application/vnd.wps-office.dps",
  92. "application/wpsofficevideo/x-matroska",
  93. // OFD MIME 类型
  94. "application/ofd",
  95. "application/x-ofd",
  96. "application/xml",
  97. "text/xml",
  98. "application/xhtml+xml",
  99. // 其他可能的 MIME 类型
  100. "application/octet-stream",
  101. "application/x-msdownload"
  102. )
  103. .build();
  104. /**
  105. * 压缩包规则
  106. */
  107. public static final FileCheckRuleConfig ARCHIVE = builder()
  108. .withExtensions(
  109. "zip", "rar", "7z", "tar", "gz", "bz2", "xz",
  110. "jar", "war", "ear", // Java 归档文件
  111. "cab", // Windows 归档文件
  112. "iso", // 光盘映像文件
  113. "dmg", // macOS 磁盘映像
  114. "apk", // Android 应用包
  115. "msi" // Windows 安装包
  116. )
  117. .withMimeTypes(
  118. "application/zip",
  119. "application/x-rar-compressed",
  120. "application/x-7z-compressed",
  121. "application/x-tar",
  122. "application/gzip",
  123. "application/x-bzip2",
  124. "application/x-xz",
  125. "application/java-archive",
  126. "application/vnd.ms-cab-compressed",
  127. "application/x-iso9660-image",
  128. "application/x-apple-diskimage",
  129. "application/vnd.android.package-archive",
  130. "application/x-msdownload",
  131. "application/x-zip-compressed",
  132. "application/x-compressed"
  133. )
  134. .build();
  135. // /**
  136. // * 特殊文件类型规则
  137. // */
  138. // public static final FileCheckRuleConfig SPECIAL = builder()
  139. // .withExtensions("mp4", "mov", "avi", "wmv", "flv", "mkv")
  140. // .withMimeTypes(
  141. // "video/mp4",
  142. // "video/quicktime",
  143. // "video/x-msvideo",
  144. // "video/x-ms-wmv",
  145. // "video/x-flv",
  146. // "video/x-matroska"
  147. // )
  148. // .build();
  149. /* ========== 组合类型规则 ========== */
  150. /**
  151. * 媒体规则(图片+视频)
  152. */
  153. public static final FileCheckRuleConfig MEDIA = combine(IMAGE, VIDEO);
  154. /**
  155. * 图片和文档规则
  156. */
  157. public static final FileCheckRuleConfig IMAGE_AND_DOCUMENT = combine(IMAGE, DOCUMENT);
  158. /**
  159. * 所有类型规则
  160. */
  161. public static final FileCheckRuleConfig ALL = combine(IMAGE, VIDEO, AUDIO, DOCUMENT, ARCHIVE);
  162. private final Set<String> allowedExtensions;
  163. private final Set<String> allowedMimeTypes;
  164. private FileCheckRuleConfig(Builder builder) {
  165. this.allowedExtensions = Collections.unmodifiableSet(builder.extensions);
  166. this.allowedMimeTypes = Collections.unmodifiableSet(builder.mimeTypes);
  167. }
  168. /**
  169. * 创建新的构建器
  170. */
  171. public static Builder builder() {
  172. return new Builder();
  173. }
  174. /**
  175. * 合并多个规则配置
  176. */
  177. public static FileCheckRuleConfig combine(FileCheckRuleConfig... configs) {
  178. Builder builder = builder();
  179. for (FileCheckRuleConfig config : configs) {
  180. builder.extensions.addAll(config.allowedExtensions);
  181. builder.mimeTypes.addAll(config.allowedMimeTypes);
  182. }
  183. return builder.build();
  184. }
  185. /**
  186. * 构建器类
  187. */
  188. public static final class Builder {
  189. private final Set<String> extensions = new HashSet<>();
  190. private final Set<String> mimeTypes = new HashSet<>();
  191. private Builder() {
  192. }
  193. public Builder withExtensions(String... extensions) {
  194. this.extensions.addAll(Arrays.asList(extensions));
  195. return this;
  196. }
  197. public Builder withMimeTypes(String... mimeTypes) {
  198. this.mimeTypes.addAll(Arrays.asList(mimeTypes));
  199. return this;
  200. }
  201. public Builder addExtension(String extension) {
  202. this.extensions.add(extension);
  203. return this;
  204. }
  205. public Builder addMimeType(String mimeType) {
  206. this.mimeTypes.add(mimeType);
  207. return this;
  208. }
  209. public Builder from(FileCheckRuleConfig config) {
  210. this.extensions.addAll(config.allowedExtensions);
  211. this.mimeTypes.addAll(config.allowedMimeTypes);
  212. return this;
  213. }
  214. public FileCheckRuleConfig build() {
  215. return new FileCheckRuleConfig(this);
  216. }
  217. }
  218. }