存储扩展
本页面介绍如何扩展文件存储方式。
存储架构
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
| 字段 | 类型 | 说明 |
|---|---|---|
| file | MultipartFile | 文件对象 |
| path | String | 存储路径 |
| isPublic | Boolean | 是否公开 |
UploadResult
| 字段 | 类型 | 说明 |
|---|---|---|
| success | Boolean | 是否成功 |
| url | String | 文件访问URL |
| fileName | String | 文件名 |
| size | Long | 文件大小 |
| errorMsg | String | 错误信息 |
使用示例
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 | 服务器本地 |
| MinIO | MinioStorageServiceImpl | MinIO对象存储 |
| 阿里云OSS | AliyunOssStorageServiceImpl | 阿里云OSS |
| 腾讯云COS | TencentCosStorageServiceImpl | 腾讯云COS |
| 七牛云 | QiniuStorageServiceImpl | 七牛云存储 |
