feat(file): 文件存储接入 RustFS(S3),修正文件外链域名与路径

文件上传从本地磁盘改为可切换的对象存储(默认 s3,type 改回 local 即退回原行为):

- 新增 common.core.storage 包:ObjectStorage 接口 + S3ObjectStorage(minio 8.5.17)
  + NoopObjectStorage + FileStorageService + StorageConfig + StoredFile;
  key 规则沿用 file/yyyyMMdd/uuid.ext、缩略图 file/thumbnail/...,桶内结构对齐旧磁盘目录
- 读取仍走后端代理 GET /api/file/**:s3 模式下首次读取物化到本地 cache-path 再返回,
  对外 URL 不变;历史本地文件一律作废,不做回退兼容
- ConfigProperties 增加 storage 配置块,endpoint/access-key/secret-key 支持环境变量覆盖
  (RUSTFS_ENDPOINT / RUSTFS_ACCESS_KEY / RUSTFS_SECRET_KEY),配置非法时启动即失败
- FileRecordService.deleteFileAsync 改为按 path 删除,本地与对象存储同时清理
- pom 固定 okhttp3.version=4.12.0、kotlin.version=1.9.25:Spring Boot 2.5.4 默认的
  okhttp 3.14.9 与 minio 所需的 okhttp 4.12.0 冲突,会导致启动即
  NoClassDefFoundError: okhttp3/ConnectionPool

同时修正文件外链拼接(以下均为改造前就存在的问题):

- application-prod.yml:server-url / file-server 由失效的 tuanwei-api.gxwebsoft.com
  改为生产实际域名 https://twai-api.gxmu.edu.cn(与 admin .env.production、
  uniapp request.js 一致),此前上传返回的 url 指向旧域名导致访问不到
- FileController 抽出 fileBaseUrl(),分页/列表原来漏了 /api/file 前缀
- OpenFileController 同样补 /api/open/file 前缀
- TzbcyMaterialServiceImpl 下载链接补 /api/file/download
This commit is contained in:
2026-10-21 23:11:45 +08:00
parent bf6813e71d
commit f5a89634c4
15 changed files with 867 additions and 229 deletions
+12
View File
@@ -21,6 +21,11 @@
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- Spring Boot 2.5.4 默认把 okhttp 钉在 3.14.9,而 minio 8.5.x 需要 4.x,
否则启动时 io.minio.S3Base 会报 RequestBody.create 方法不存在。
okhttp 4.x 依赖 kotlin-stdlib,故一并覆盖 Spring Boot 管理的 kotlin 版本。 -->
<okhttp3.version>4.12.0</okhttp3.version>
<kotlin.version>1.9.25</kotlin.version>
</properties>
<dependencies>
@@ -174,6 +179,13 @@
<version>2.1.0</version>
</dependency>
<!-- minio sdk, 兼容 S3 协议对象存储(RustFS/MinIO) -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.17</version>
</dependency>
<!-- spring-boot-mail -->
<dependency>
<groupId>org.springframework.boot</groupId>