# Spring Boot 集成 MinIO
## 引入依赖
```xml
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.4.4</version>
</dependency>
```
如果引入依赖报下列异常:
```
An attempt was made to call a method that does not exist. The attempt was made from the following location:
io.minio.S3Base.<clinit>(S3Base.java:105)
The following method did not exist:
okhttp3.RequestBody.create([BLokhttp3/MediaType;)Lokhttp3/RequestBody;
The method's class, okhttp3.RequestBody, is available from the following locations:
jar:file:/D:/repository/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar!/okhttp3/RequestBody.class
The class hierarchy was loaded from the following locations:
okhttp3.RequestBody: file:/D:/repository/com/squareup/okhttp3/okhttp/3.14.9/okhttp-3.14.9.jar
Action:
Correct the classpath of your application so that it contains a single, compatible version of okhttp3.RequestBody
```
>注意:由于`okhttp3`依赖冲突,默认的版本低于`minio`所需版本,会导致启动失败。
可通过以下方法解决:**排除自身`okhttp`依赖并引入高版本的`okhttp`依赖**
```xml
<dependencies>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.4.4</version>
<exclusions>
<exclusion>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
</dependencies>
```
## MinIO配置文件
**修改`application.yml`配置文件**
```yml
# MinIO配置
minio:
# 服务地址
endpoint: http://127.0.0.1:9000
# 文件预览地址
preview: http://127.0.0.1:9000
# 存储桶名称
bucket: spring-boot-learning-examples
# 用户名
access-key: minioadmin
# 密码
secret-key: minioadmin
```
## MinIO工具类
```java
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.MediaTypeFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
* MinIO工具类
*
* @author william@StarImmortal
* @date 2022/04/19
*/
@Slf4j
@Component
public class MinioUtil {
private static MinioClient minioClient;
/**
* setter注入
*
* @param minioClient 客户端
*/
@Autowired
public void setMinioClient(MinioClient minioClient) {
MinioUtil.minioClient = minioClient;
}
/**
* 启动SpringBoot容器的时候初始化Bucket,如果没有Bucket则创建
*/
public static void createBucket(String bucketName) throws Exception {
if (!bucketExists(bucketName)) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
}
/**
* 判断Bucket是否存在
*
* @return true:存在,false:不存在
*/
public static boolean bucketExists(String bucketName) throws Exception {
return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
}
/**
* 获得Bucket策略
*
* @param bucketName 存储桶名称
* @return Bucket策略
*/
public static String getBucketPolicy(String bucketName) throws Exception {
return minioClient.getBucketPolicy(GetBucketPolicyArgs.builder().bucket(bucketName).build());
}
/**
* 获得所有Bucket列表
*
* @return Bucket列表
*/
public static List<Bucket> getAllBuckets(MinioClient minioClient) throws Exception {
return minioClient.listBuckets();
}
/**
* 根据存储桶名称获取其相关信息
*
* @param bucketName 存储桶名称
* @return 相关信息
*/
public static Optional<Bucket> getBucket(String bucketName) throws Exception {
return getAllBuckets(minioClient)
.stream()
.filter(b -> b.name().equals(bucketName))
.findFirst();
}
/**
* 根据存储桶名称删除Bucket,true:删除成功;false:删除失败,文件或已不存在
*
* @param bucketName 存储桶名称
*/
public static void removeBucket(String bucketName) throws Exception {
minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
}
/**
* 判断文件是否存在
*
* @param bucketName 存储桶名称
* @param objectName 文件名
* @return true:存在;false:不存在
*/
public static boolean isObjectExist(String bucketName, String objectName) {
boolean exist = true;
try {
minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
} catch (Exception e) {
exist = false;
}
return exist;
}
/**
* 判断文件夹是否存在
*
* @param bucketName 存储桶名称
* @param objectName 文件夹名称
* @return true:存在;false:不存在
*/
public static boolean isFolderExist(String bucketName, String objectName) {
boolean exist = false;
try {
ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder()
.bucket(bucketName)
.prefix(objectName)
.recursive(false)
.build();
Iterable<Result<Item>> results = minioClient.listObjects(listObjectsArgs);
for (Result<Item> result : results) {
Item item = result.get();
if (item.isDir() && objectName.equals(item.objectName())) {
exist = true;
}
}
} catch (Exception e) {
exist = false;
}
return exist;
}
/**
* 根据文件前缀查询文件
*
* @param bucketName 存储桶名称
* @param prefix 前缀
* @param recursive 是否使用递归查询
* @return MinioItem列表
*/
public static List<Item> getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) throws Exception {
List<Item> list = new ArrayList<>();
ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder()
.bucket(bucketName)
.prefix(prefix)
.recursive(recursive)
.build();
Iterable<Result<Item>> objectsIterator = minioClient.listObjects(listObjectsArgs);
if (objectsIterator != null) {
for (Result<Item> o : objectsIterator) {
Item item = o.get();
list.add(item);
}
}
return list;
}
/**
* 获取文件流
*
* @param bucketName 存储桶名称
* @param objectName 文件名
* @return 二进制流
*/
public static InputStream getObject(String bucketName, String objectName) throws Exception {
GetObjectArgs getObjectArgs = GetObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.build();
return minioClient.getObject(getObjectArgs);
}
/**
* 断点下载
*
* @param bucketName 存储桶名称
* @param objectName 文件名称
* @param offset 起始字节的位置
* @param length 要读取的长度
* @return 二进制流
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
内容概要:首先带着读者安装MinIO,并帮助读者通过 Spring Boot 框架一步步完成 MinIO 集成,快速上手分布式对象存储系统。在手写MinIO 工具类的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 适合人群:具备一定编程基础,工作1-3年的研发人员 能学到什么:①MinIO安装;②Spring Boot 快速集成 MinIO。 阅读建议:此资源以开发 Spring Boot 集成 MinIO 学习其原理和内核,不仅是代码编写实现也更注重内容上的需求分析和方案设计,所以在学习的过程要结合这些内容一起来实践,并调试对应的代码。
资源详情
资源评论
资源推荐
收起资源包目录
spring-boot-learning-examples.zip (29个子文件)
spring-boot-learning-examples
pom.xml 4KB
README.zh-CN.md 4KB
spring-boot-minio
pom.xml 1KB
.DS_Store 6KB
src
test
java
com
starimmortal
minio
.DS_Store 6KB
main
resources
application.yml 743B
static
favicon.ico 21KB
java
com
starimmortal
minio
MinioApplication.java 2KB
controller
MinioController.java 2KB
configuration
MinioProperties.java 1KB
Knife4jConfiguration.java 4KB
MinioConfiguration.java 914B
util
MinioUtil.java 13KB
FileUtil.java 6KB
.gitignore 378B
README.md 18KB
LICENSE 1KB
.DS_Store 6KB
spring-boot-base-core
pom.xml 3KB
target
classes
application.yml 358B
com
starimmortal
core
vo
ResponseVO.class 5KB
jwt
enumeration
Code.class 4KB
generated-sources
annotations
src
test
java
com
starimmortal
core
main
resources
application.yml 358B
java
com
starimmortal
core
constant
configuration
util
enumeration
Code.java 3KB
vo
ResponseVO.java 2KB
.gitignore 397B
README.md 430B
.gitignore 378B
README.md 4KB
共 29 条
- 1
人人都在发奋
- 粉丝: 5986
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论10