# 文件存储模块 统一的文件存储模块,支持本地、MinIO、OSS 等多种存储策略。 ## 引入依赖 ```xml com.mdframe.forge forge-starter-file ``` ## 配置 ```yaml forge: file: default-storage: local storages: local: path: /data/uploads minio: endpoint: http://localhost:9000 access-key: minioadmin secret-key: minioadmin bucket: forge ``` ## 使用示例 ### 基础上传 ```java @Autowired private FileManager fileManager; public FileMetadata upload(MultipartFile file) { return fileManager.upload(file, "avatar", "user_001"); } ``` ### 指定存储策略 ```java public FileMetadata uploadToMinio(MultipartFile file) { return fileManager.upload(file, "document", "order_001", "minio"); } ``` ### 下载文件 ```java public void download(String fileId, HttpServletResponse response) { fileManager.download(fileId, response); } ``` ### 获取访问 URL ```java // 获取临时访问 URL(有效期 1 小时) String url = fileManager.getAccessUrl(fileId, 3600); ``` ### 删除文件 ```java boolean success = fileManager.delete(fileId); ``` ### 分片上传 ```java // 初始化分片上传 String uploadId = fileManager.initMultipartUpload( "large_file.zip", "document", "order_001", "minio" ); // 上传分片 String eTag = fileManager.uploadPart(uploadId, 1, inputStream, "minio"); // 完成分片上传 FileMetadata metadata = fileManager.completeMultipartUpload( uploadId, Arrays.asList(eTag1, eTag2, eTag3), "minio" ); ``` ## SPI 扩展 ### StorageConfigProvider 动态获取存储配置: ```java @Component public class MyStorageConfigProvider implements StorageConfigProvider { @Override public StorageConfig getDefaultConfig() { // 返回默认存储配置 } @Override public StorageConfig getConfigByType(String storageType) { // 返回指定类型的存储配置 } } ``` ### FileMetadataPersistence 持久化文件元数据: ```java @Component public class MyFileMetadataPersistence implements FileMetadataPersistence { @Override public void save(FileMetadata metadata) { // 保存文件元数据 } @Override public FileMetadata getById(String fileId) { // 根据 ID 查询 } @Override public FileMetadata getByMd5(String md5) { // 根据 MD5 查询(用于秒传) } @Override public void delete(String fileId) { // 删除元数据 } @Override public void incrementDownloadCount(String fileId) { // 增加下载次数 } } ``` ## 自定义存储策略 ```java @Component public class MyFileStorage implements FileStorage { @Override public String getStorageType() { return "my-storage"; } @Override public FileMetadata upload(MultipartFile file, String businessType, String businessId) { // 实现上传逻辑 } @Override public InputStream download(String fileId) { // 实现下载逻辑 } @Override public void delete(String fileId) { // 实现删除逻辑 } @Override public String getAccessUrl(String fileId, Integer expires) { // 返回访问 URL } } ``` ## FileMetadata 结构 ```java public class FileMetadata { private String fileId; // 文件 ID private String fileName; // 文件名 private String originalName; // 原始文件名 private String filePath; // 文件路径 private String mimeType; // MIME 类型 private Long fileSize; // 文件大小 private String md5; // MD5 值 private String storageType; // 存储类型 private String businessType; // 业务类型 private String businessId; // 业务 ID private Integer downloadCount; // 下载次数 } ```