MinIO简介
MinIO 是一款基于Go语言的高性能对象存储服务,在Github上已有28K+Star。它采用了Apache License v2.0开源协议,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。
安装
使用Docker安装MinIO服务非常简单,几个命令就可以搞定!
-
首先下载MinIO的Docker镜像;
docker pull minio/minio
-
下载完成后使用如下命令运行MinIO服务,注意使用
--console-address
指定MinIO Console的运行端口(否则会随机端口运行):
docker run -p 9090:9000 -p 9001:9001 --name minio \
-v /mydata/minio/data:/data \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=minioadmin \
-d minio/minio server /data --console-address ":9001"
-
运行成功后就可访问MinIO Console的管理界面了,输入账号密码
minioadmin:minioadmin
即可登录,访问地址:http://192.168.7.142:9090
MinIO Console使用
MinIO Console是MinIO自带的可视化管理工具,比起上一代的可视化工具功能还是强大了不少的,下面我们来体验下这个工具。
-
先来看下上一代的MinIO Browser,基本只支持存储桶及文件的管理功能;
-
再来看下MinIO Console,不仅支持了存储桶、文件的管理,还增加了用户、权限、日志等管理功能,强了不少;
-
在存储文件之前,我们首先得创建一个存储桶;
-
创建成功后,再上传一个文件;
-
上传成功后如果你想从外部访问文件的话,需要把访问策略设置为公开,这里的策略只有公开和私有两种,感觉不太灵活;
-
之后把地址改为外网访问地址即可访问图片,默认只能下载不能直接查看(这个问题我们下面再解决),外网访问地址:需要将iphe端口号换为http://192.168.177.138:9090/
spring-boot集成
初始化一个springboot项目大家都会,这里不多做介绍。
主要是介绍需要引入的依赖:
<!-- thymeleaf模板渲染引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 操作minio的java客户端-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.1</version>
</dependency>
<!-- lombok插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
下面介绍配置文件:
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
#minio配置
minio:
access-key: minioadmin #minio的登录用户
secret-key: minioadmin #minio的登录密码
url: http://192.168.177.138:9090 #访问地址
bucket-name: wdhcr #存储桶的命名
thymeleaf:
cache: false
创建minio的配置类:
@Configuration
@ConfigurationProperties(prefix = "spring.minio")
@Data
public class MinioConfiguration {
private String accessKey;
private String secretKey;
private String url;
private String bucketName;
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(url)
.credentials(accessKey, secretKey)
.build();
}
}
使用配置属性绑定进行参数绑定,并初始化一个minio client对象放入容器中
下面就是我封装的minio client 操作minio的简单方法的组件。
import com.xc.config.MinioConfiguration;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.errors.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
@Component
public class MinioComp {
@Autowired
private MinioClient minioClient;
@Autowired
private MinioConfiguration configuration;
/**
* @description: 上传文件
* @dateTime: 2021/5/13 14:17
*/
public String upload(MultipartFile file, String fileName) {
// 使用putObject上传一个文件到存储桶中。
String url=null;
try {
InputStream inputStream = file.getInputStream();
minioClient.putObject(PutObjectArgs.builder()
.bucket(configuration.getBucketName())
.object(fileName)
.stream(inputStream, file.getSize(), -1)
.contentType(file.getContentType())
.build());
url = configuration.getUrl()+"/"+configuration.getBucketName()+"/"+fileName;
} catch (ErrorResponseException e) {
e.printStackTrace();
} catch (InsufficientDataException e) {
e.printStackTrace();
} catch (InternalException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (InvalidResponseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (ServerException e) {
e.printStackTrace();
} catch (XmlParserException e) {
e.printStackTrace();
}
return url;
}
}
其他地方进行调用时返回的就是上传图片之后的访问路径:
public R upload(MultipartFile file){
String name = file.getOriginalFilename();
String hz = name.substring(name.lastIndexOf("."));
String path = minioComp.upload(file, UUID.randomUUID() + hz);
return R.success(path);
}
如果上传时遇到问题:
error occurred
ErrorResponse(code = RequestTimeTooSkewed, message = The difference between the request time and the server's time is too large., bucketName = null, objectName = null, resource = /xc-file, requestId = null, hostId = c728b90f-7e65-46d3-af30-2760f704d393)
则需要将Linux的时区更改一下
安装工具
yum -y install ntp ntpdate
同步网络时间
ntpdate cn.pool.ntp.org
使用date命令查看当前时间是否为windows时间