目录
- 一、概述
- 二、下载二进制文件安装minio
- 三、spring boot整合使用minio
- 1、使用maven引入minio依赖
- 2、在`application.yml`中定义连接`minio`的参数
- 3、定义一个`MinioUtil.java`工具类
- 四、总结
一、概述
最近在学习使用minio
,在这里对自己的学习过程做一个记录和总结,方便自己查阅。Minio
是GlusterFS创始人之一Anand Babu Periasamy发布新的开源项目。Minio
兼容Amason的S3分布式对象存储项目,采用Golang实现,客户端支持Java、Python、Javacript、 Golang语言。
Minio
可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作在Windows、Linux、 OS X和FreeBSD上。安装和配置非常简单,基本是复制可执行程序,单行命令就可以运行起来。minio
还可以通过容器部署以及部署到k8s
集群,详细部署方式可以查看官方文档。
minio中文官方文档地址: https://docs.min.io/cn/ minio的源码地址:https://github.com/minio/minio
二、下载二进制文件安装minio
使用如下命令快速安装一个单机minio
# 下载 minio
wget https://dl.min.io/server/minio/release/linux-amd64/minio
# 添加可执行权限
chmod +x minio
# 设置登录minio的 access key
export MINIO_ACCESS_KEY=minioadmin
# 设置登录minio的 secret key
export MINIO_SECRET_KEY=minioadmin
# 启动 minio
./minio server /data
安装后使用浏览器访问http://127.0.0.1:9000,如果可以访问,则表示minio已经安装成功。输入上面自定义的access key 和 secret key就可以登录了。
三、spring boot整合使用minio
1、使用maven引入minio依赖
在pom.xml中添加如下依赖,minio的最新依赖版本可以到maven中央仓库搜索,这里使用的最新版7.1.0
<properties>
<minio.version>7.1.0</minio.version>
</properties>
<!-- minio -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>${minio.version}</version>
</dependency>
2、在application.yml
中定义连接minio
的参数
# minio 连接参数
minio:
endpoint: 127.0.0.1
port: 9000
accessKey: minioadmin
secretKey: minioadmin
bucketName: image
3、定义一个MinioUtil.java
工具类
@Slf4j
@Component
public class MinioUtils {
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.port}")
private Integer port;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
@Value("${minio.bucketName}")
private String bucketName;
private static MinioClient minioClient;
public MinioClient getInstance() {
if (minioClient == null) {
minioClient = MinioClient.builder().endpoint(endpoint, port, false).credentials(accessKey, secretKey).build();
}
return minioClient;
}
/**
*
* @Description 获取minio所有的桶
* @return java.util.List<io.minio.messages.Bucket>
**/
public List<Bucket> getAllBucket() throws Exception {
// 获取minio中所以的bucket
List<Bucket> buckets = getInstance().listBuckets();
for (Bucket bucket : buckets) {
log.info("bucket 名称: {} bucket 创建时间: {}", bucket.name(), bucket.creationDate());
}
return buckets;
}
/**
*
* @Description 将图片上传到minio服务器
* @param inputStream: 输入流
* @param objectName: 对象名称
* @return void
**/
public void uploadToMinio(InputStream inputStream, String objectName) {
try {
long size = inputStream.available();
PutObjectArgs putObjectArgs = PutObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.stream(inputStream, size, -1)
.build();
// 上传到minio
getInstance().putObject(putObjectArgs);
inputStream.close();
} catch (Exception e) {
log.error(e.getMessage());
e.printStackTrace();
}
}
/**
*
* @Description 根据指定的objectName获取下载链接,需要bucket设置可下载的策略
* @param objectName: 对象的名称
* @return java.lang.String
**/
public String getUrlByObjectName(String objectName) {
String objectUrl = null;
try {
objectUrl = getInstance().getObjectUrl(bucketName, objectName);
} catch (Exception e) {
log.error(e.getMessage());
e.printStackTrace();
}
return objectUrl;
}
/**
*
* @Description 根据objectName从minio中下载文件到指定的目录
* @param objectName: objectName
* @param fileName: 文件名称
* @param dir: 文件目录
* @return void
**/
public void downloadImageFromMinioToFile(String objectName, String fileName, String dir) throws Exception {
GetObjectArgs objectArgs = GetObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.build();
File file = new File(dir);
if (!file.exists()) {
file.mkdirs();
}
InputStream inputStream = getInstance().getObject(objectArgs);
FileOutputStream outputStream = new FileOutputStream(new File(dir, fileName.substring(fileName.lastIndexOf("/")+1)));
int length;
byte[] buffer = new byte[1024];
while ((length = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, length);
}
outputStream.close();
inputStream.close();
}
}
四、总结
最后做一个总结,这里只是对minio做一个简单的介绍和使用,详细的使用方式需要查阅官方文档。对于一些新的api的学习,最好是直接通过IDE(推荐使用Intellij IDEA)下载源码查看java doc 进行学习,举个例子:当使用minio上传对象,我们不知道该怎么传递参数的时候,我们可以通过IDEA提供的快捷键(ctrl + Q)查看api的java doc, 如下图所示:
这样对于快速掌握api的使用是非常有帮助的。
minio白皮书:http://www.cloudbin.cn/?p=2917