Skip to content

存储扩展

本页面介绍如何扩展文件存储方式。

存储架构

StorageService (存储服务接口)

    ├── LocalStorageServiceImpl (本地存储)
    ├── MinioStorageServiceImpl (MinIO存储)
    ├── AliyunOssStorageServiceImpl (阿里云OSS)
    ├── TencentCosStorageServiceImpl (腾讯云COS)
    ├── QiniuStorageServiceImpl (七牛云)
    └── CustomStorageServiceImpl (自定义存储)

实现步骤

1. 实现存储接口

java
@Service
public class CustomStorageServiceImpl implements StorageService {

    @Override
    public String getType() {
        return "custom";
    }

    @Override
    public UploadResult upload(UploadRequest request) {
        // 1. 获取文件信息
        MultipartFile file = request.getFile();
        String fileName = generateFileName(file);

        // 2. 上传到存储服务
        // 自定义上传逻辑

        // 3. 返回上传结果
        UploadResult result = new UploadResult();
        result.setSuccess(true);
        result.setUrl("https://cdn.example.com/" + fileName);
        result.setFileName(fileName);
        return result;
    }

    @Override
    public boolean delete(String fileUrl) {
        // 删除文件
        return true;
    }

    @Override
    public String getPresignedUrl(String fileName, long expireTime) {
        // 获取预签名URL(用于私有存储)
        return null;
    }

    private String generateFileName(MultipartFile file) {
        String ext = FilenameUtils.getExtension(file.getOriginalFilename());
        return UUID.randomUUID().toString() + "." + ext;
    }
}

2. 注册存储服务

java
@Configuration
public class StorageConfig {

    @Bean
    public StorageService customStorageService() {
        return new CustomStorageServiceImpl();
    }
}

3. 配置存储参数

yaml
# application.yml
storage:
  type: custom
  custom:
    endpoint: https://storage.example.com
    accessKey: your_access_key
    secretKey: your_secret_key
    bucket: your_bucket
    domain: https://cdn.example.com

存储接口说明

UploadRequest

字段类型说明
fileMultipartFile文件对象
pathString存储路径
isPublicBoolean是否公开

UploadResult

字段类型说明
successBoolean是否成功
urlString文件访问URL
fileNameString文件名
sizeLong文件大小
errorMsgString错误信息

使用示例

java
@Autowired
private StorageService storageService;

public String uploadImage(MultipartFile file) {
    UploadRequest request = new UploadRequest();
    request.setFile(file);
    request.setPath("images/");

    UploadResult result = storageService.upload(request);
    if (!result.isSuccess()) {
        throw new BusinessException("上传失败:" + result.getErrorMsg());
    }

    return result.getUrl();
}

文件类型限制

java
// 允许的图片类型
private static final Set<String> IMAGE_TYPES = Set.of(
    "image/jpeg", "image/png", "image/gif", "image/webp"
);

// 允许的文件类型
private static final Set<String> FILE_TYPES = Set.of(
    "application/pdf", "application/msword",
    "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
);

// 文件大小限制
private static final long MAX_IMAGE_SIZE = 2 * 1024 * 1024; // 2MB
private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB

现有存储方式

方式说明
本地存储LocalStorageServiceImpl服务器本地
MinIOMinioStorageServiceImplMinIO对象存储
阿里云OSSAliyunOssStorageServiceImpl阿里云OSS
腾讯云COSTencentCosStorageServiceImpl腾讯云COS
七牛云QiniuStorageServiceImpl七牛云存储

下一步

成都艾唯特软件有限公司