package jnpf.fileStorage; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.x.file.storage.core.FileStorageService; import org.dromara.x.file.storage.core.platform.FileStorage; import org.dromara.x.file.storage.core.platform.MinioFileStorage; import org.dromara.x.file.storage.core.platform.MinioFileStorageClientFactory; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @Slf4j @Component @RequiredArgsConstructor public class SeaweedFsStorageRegistrar { private final SeaweedFsStorageProperties properties; private final FileStorageService fileStorageService; private final List registeredStorages = new ArrayList<>(); @PostConstruct void register() { for (SeaweedFsStorageProperties.SeaweedFsConfig config : properties.getSeaweedfs()) { if (!Boolean.TRUE.equals(config.getEnableStorage())) { continue; } validate(config); synchronized (fileStorageService.getFileStorageList()) { ensureUnique(config.getPlatform()); MinioFileStorageClientFactory clientFactory = new MinioFileStorageClientFactory(config); MinioFileStorage storage = new MinioFileStorage(config, clientFactory); fileStorageService.getFileStorageList().add(storage); registeredStorages.add(storage); } log.info("SeaweedFS 存储平台已注册: platform={}, bucket={}", config.getPlatform(), config.getBucketName()); } } @PreDestroy void unregister() { for (MinioFileStorage storage : registeredStorages) { fileStorageService.getFileStorageList().remove(storage); storage.close(); } registeredStorages.clear(); } private void ensureUnique(String platform) { for (FileStorage storage : fileStorageService.getFileStorageList()) { if (platform.equals(storage.getPlatform())) { throw new IllegalStateException("文件存储平台标识重复: " + platform); } } } private void validate(SeaweedFsStorageProperties.SeaweedFsConfig config) { requireText(config.getPlatform(), "platform"); if (!config.getPlatform().startsWith("seaweedfs-")) { throw new IllegalStateException("SeaweedFS 平台标识必须以 seaweedfs- 开头"); } requireText(config.getAccessKey(), "access-key"); requireText(config.getSecretKey(), "secret-key"); requireText(config.getEndPoint(), "end-point"); requireText(config.getBucketName(), "bucket-name"); } private void requireText(String value, String field) { if (value == null || value.trim().isEmpty()) { throw new IllegalStateException("SeaweedFS 配置缺少 " + field); } } }