简介
MinIO
是一款开源的对象存储服务,兼容 Amazon S3 云存储服务接口,适用于存储大容量非结构化数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。
SpringBoot 可以轻松地与 MinIO 集成,实现文件上传、下载、删除等功能。
- 添加依赖:
在你的pom.xml
文件中添加MinIO客户端库的依赖。
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.3.1</version> <!-- 请使用最新的版本号 -->
</dependency>
- 配置MinIO客户端:
在你的application.yml
或application.properties
文件中配置MinIO的连接信息。
minio:
endpoint: "http://127.0.0.1:9000" # MinIO服务的地址
access-key: "minioadmin" # MinIO的访问密钥
secret-key: "minioadmin" # MinIO的密钥
bucket: "mybucket" # 默认的存储桶名称
- 创建MinIO配置类:
创建一个配置类,用于初始化MinIO客户端。
@Component
public class MinIOConfig implements InitializingBean {
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.access-key}")
private String accessKey;
@Value("${minio.secret-key}")
private String secretKey;
@Value("${minio.bucket}")
private String bucket;
private MinioClient minioClient;
@PostConstruct
public void init() {
minioClient = MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
createBucketIfNotExists(bucket);
}
private void createBucketIfNotExists(String bucketName) {
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
}
public MinioClient getClient() {
return minioClient;
}
}
- 创建MinIO工具类:
创建一个工具类,封装文件的上传、下载和删除等操作。
@Component
public class MinIOUtils {
@Autowired
private MinIOConfig minIOConfig;
public void uploadFile(MultipartFile file) throws Exception {
try (InputStream inputStream = file.getInputStream()) {
String fileName = file.getOriginalFilename();
minIOConfig.getClient().putObject(PutObjectArgs.builder()
.bucket(minIOConfig.getBucket())
.object(fileName)
.stream(inputStream, inputStream.available(), -1)
.build());
}
}
public void downloadFile(String objectName, HttpServletResponse response) throws Exception {
minIOConfig.getClient().getObject(
GetObjectArgs.builder()
.bucket(minIOConfig.getBucket())
.object(objectName)
.build(),
response.getOutputStream());
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(objectName, "UTF-8") + "\"");
}
public boolean deleteFile(String objectName) {
return minIOConfig.getClient().removeObject(
RemoveObjectArgs.builder()
.bucket(minIOConfig.getBucket())
.object(objectName)
.build());
}
}
- 创建控制器:
创建一个控制器,处理文件的上传、下载和删除请求。
@RestController
public class MinIOController {
@Autowired
private MinIOUtils minIOUtils;
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
try {
minIOUtils.uploadFile(file);
return "File uploaded successfully!";
} catch (Exception e) {
return "File upload failed: " + e.getMessage();
}
}
@GetMapping("/download/{objectName}")
public void download(@PathVariable String objectName, HttpServletResponse response) {
try {
minIOUtils.downloadFile(objectName, response);
} catch (Exception e) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}
@DeleteMapping("/delete/{objectName}")
public String delete(@PathVariable String objectName) {
try {
return minIOUtils.deleteFile(objectName) ? "File deleted successfully!" : "File deletion failed.";
} catch (Exception e) {
return "File deletion failed: " + e.getMessage();
}
}
}
总结
以上步骤和代码示例展示了如何在Spring Boot应用程序中整合MinIO。确保你的MinIO服务已经运行,并且在配置文件中正确设置了连接信息。此外,你可能需要根据实际情况调整版本号、端点、访问密钥和存储桶名称等配置。在实现文件操作时,务必处理好异常情况,确保应用程序的健壮性。