MinIO 是一个开源的对象存储服务,兼容 Amazon S3 API,适合存储非结构化数据(如图片、视频、日志等)。它具有高性能、可扩展性强、部署灵活等特点,常被用于私有云或企业内部存储解决方案。
在 Spring Boot 中使用 MinIO 的步骤
1. 添加依赖
在 pom.xml
中添加 MinIO 客户端依赖:
xml
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.2</version> <!-- 版本号可根据最新稳定版调整 -->
</dependency>
2. 配置 MinIO 连接信息
在 application.yml
或 application.properties
中配置连接参数:
yaml
minio:
url: http://localhost:9000 # MinIO 服务地址
access-key: minioadmin # 访问密钥(默认账号)
secret-key: minioadmin # 密钥(默认密码)
bucket-name: my-bucket # 默认存储桶名称
3. 创建 MinIO 配置类
配置 MinIO 客户端实例:
java
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MinioConfig {
@Value("${minio.url}")
private String url;
@Value("${minio.access-key}")
private String accessKey;
@Value("${minio.secret-key}")
private String secretKey;
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(url)
.credentials(accessKey, secretKey)
.build();
}
}
4. 封装 MinIO 操作工具类
创建工具类封装常用操作(如创建桶、上传 / 下载文件等):
java
@Component
public class MinioUtil {
@Autowired
private MinioClient minioClient;
@Value("${minio.bucket-name}")
private String defaultBucket;
// 检查存储桶是否存在
public boolean bucketExists(String bucketName) throws Exception {
return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
}
// 创建存储桶
public void createBucket(String bucketName) throws Exception {
if (!bucketExists(bucketName)) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
}
// 上传文件
public void uploadFile(String objectName, MultipartFile file) throws Exception {
// 确保默认桶存在
createBucket(defaultBucket);
minioClient.putObject(
PutObjectArgs.builder()
.bucket(defaultBucket)
.object(objectName)
.stream(file.getInputStream(), file.getSize(), -1)
.contentType(file.getContentType())
.build()
);
}
// 下载文件
public InputStream downloadFile(String objectName) throws Exception {
return minioClient.getObject(
GetObjectArgs.builder()
.bucket(defaultBucket)
.object(objectName)
.build()
);
}
// 删除文件
public void deleteFile(String objectName) throws Exception {
minioClient.removeObject(
RemoveObjectArgs.builder()
.bucket(defaultBucket)
.object(objectName)
.build()
);
}
// 获取文件访问URL(临时链接,有效期1小时)
public String getFileUrl(String objectName) throws Exception {
return minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.bucket(defaultBucket)
.object(objectName)
.method(Method.GET)
.expiry(1, TimeUnit.HOURS)
.build()
);
}
// 获取所有存储桶列表
public List<Bucket> getAllBuckets() throws Exception {
return minioClient.listBuckets();
}
}
5. 在业务中使用
通过工具类实现文件上传等功能:
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/file")
public class FileController {
@Autowired
private MinioUtil minioUtil;
// 上传文件示例
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
try {
// 使用原文件名作为存储名称(实际业务中建议生成唯一文件名)
String fileName = file.getOriginalFilename();
minioUtil.uploadFile(fileName, file);
return "文件上传成功:" + fileName;
} catch (Exception e) {
return "上传失败:" + e.getMessage();
}
}
// 获取文件访问链接示例
@GetMapping("/url/{fileName}")
public String getFileUrl(@PathVariable String fileName) {
try {
return minioUtil.getFileUrl(fileName);
} catch (Exception e) {
return "获取链接失败:" + e.getMessage();
}
}
}
注意事项
-
MinIO 服务部署:需先在本地或服务器部署 MinIO 服务(可通过 Docker 快速启动)。
-
权限管理 :生产环境中需修改默认的
access-key
和secret-key
,并配置存储桶的访问权限。 -
异常处理:实际项目中需完善异常处理逻辑,避免直接抛出异常。
-
文件命名:建议使用唯一标识符(如 UUID)作为文件名,避免重复覆盖。
通过以上步骤,即可在 Spring Boot 项目中集成 MinIO 实现对象存储功能。