Java抽象类统一文件上传下载校验:父类强制执行空文件、大小、后缀、MIME类型、文件名安全等基础校验,子类实现白名单、存储路径、权限检查等差异化逻辑,并提供安全重命名、标准化异常响应与日志。

Java 中抽象类统一定义文件上传下载的基础校验流程,关键是把“所有子类都必须做、且做法高度一致”的安全动作抽出来,由父类强制执行;而“每个业务场景不一样”的部分(如允许哪些后缀、存到哪、是否要查数据库权限),留给子类自己决定。
定义校验契约与执行顺序
在抽象类中声明 final 的主流程方法,例如 validateAndProcess(),内部按固定顺序调用可被子类覆盖的钩子方法:
-
checkEmpty():统一拦截空文件(
file.isEmpty()),避免后续处理无效 - checkSize():读取配置或调用子类提供的最大允许字节数,超限直接拒绝
-
checkExtension():提取原始文件名后缀,交由子类实现白名单判断(如只允许
pdf、xlsx) -
checkContentType():对比
MultipartFile.getContentType()与子类认可的 MIME 类型(如application/pdf),防伪造头 -
checkFilenameSafety():子类负责过滤路径遍历字符(
..、/、\),确保重命名逻辑不被绕过
封装安全的文件操作入口
抽象类不暴露原始 MultipartFile 或 HttpServletResponse,而是提供受控的工具方法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 提供 safeRename(String originalName):默认生成 UUID + 保留合法后缀,子类可复写以加入业务标识
- 提供 getStoragePath() 抽象方法:让子类返回真实存储目录(如
/opt/uploads/report/),父类确保该路径存在且可写 - 下载时统一调用 writeToResponse(HttpServletResponse, File):自动设置
Content-Disposition(含 UTF-8 编码中文名)、Content-Length和合理Content-Type,子类无需碰流
统一异常响应与日志上下文
所有校验失败或 I/O 异常,均由抽象类捕获并标准化处理:
立即学习“Java免费学习笔记(深入)”;
- 抛出的异常统一转为
ErrorResponse对象,含错误码(如FILE_EMPTY、FILE_TYPE_MISMATCH)、用户提示语、时间戳 - 记录详细日志:包括请求 IP、用户 ID(若已认证)、原始文件名、检测到的 ContentType、实际大小、触发的校验环节
- 子类只需关注“什么条件下算合法”,不用写 try-catch、不用拼 JSON、不用记日志格式
支持差异化策略的扩展点
抽象类预留几个 protected 方法,让子类按需定制而不破坏主流程:
-
isNeedPermissionCheck():返回 true 时,父类自动调用子类的
verifyUserAccess(fileId) -
getAllowedExtensions():返回
List<String>,供checkExtension()使用,不同模块可返回不同集合 - shouldScanVirus():为上传流程增加可选的病毒扫描钩子(对接 ClamAV 等),默认 false

















