Minio是什么?
Minio是一个开源的、云原生的分布式对象存储系统,是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据。
它一大特点就是轻量,虽然轻量,却拥有着不错的性能。使用简单,功能强大,支持各种平台,单个文件最大5TB,兼容 Amazon S3接口,提供了 Java、Python、GO等多版本SDK支持。
Windows环境安装Minio
1、下载服务端和客户端安装包文件
下载地址:MinIO | Code and downloads to create high performance object storage
服务端文件:minio.exe 用于接收文件信息
客户端文件:mac.exe 用于上传文件 ,如果用程序代码操作文件存储,只启动服务端就ok
2、创建minio目录
1、创建一个minio的文件夹,存放minio相关文件
2、在minio文件夹中创建minio的应用目录bin,存放mc.exe 以及minio.exe 文件 。
3、在minio文件夹中创建minio的数据目录data,存放相关数据文件
4、在minio文件夹中创建minio的数据目录log,存储相关日志
(以上目录名称可以随便命名,不建议中文哦)
3、启动minio服务器
启动方式有两种,个人比较推荐第一种命令启动哈
1、命令启动
2、新建.bat文件启动
特别提示:在windows 安装软件我们都习惯双击.exe 文件启动。minio可不行奥,可不行,可不行。千万不能去双击运行,这样可能会导致最终启动失败;无论是windows还是linux都建议通过命令启动的。懂的打个懂。
在这里就主要介绍下命令启动
3.1、以管理员权限打开cmd窗口,进入到minio.exe所在bin目录
3.2、设置用户名
用于登录minio客户端
setx MINIO_ROOT_USER admin
3.3、设置登录密码
setx MINIO_ROOT_PASSWORD 123456
3.4、启动Minio服务
.\minio.exe server E:\minio\data --console-address "127.0.0.1:9000" --address "127.0.0.1:9005"
D:\minio\data 指定数据存放路径
9005是控制台端口,9000是服务的端口。
4.5、访问minio服务器
访问客户端地址 http://127.0.0.1:9000/ 输入用户密码
点击桶名称,可以看到该桶内的所有文件
点击Upload按钮可以上传文件,当然点击文件也可以下载哦
到这里minio在windows安装就成功了哦。
4.使用minio
新建buckets
设置匿名用户的访问权限
手动上传文件
新建路径,不是必须的
上传文件
点击"upload",选择上传的文件即可
访问路径
注意:端口号是9000
SpringBoot中使用
导入jar
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
配置类
minio:
endpoint: http://192.168.1.102:9000
accessKey: minioadmin
secretKey: minioadmin
# accessKey: tfhXFoXuSlLNMQHHV35F
# secretKey: com0CFFwJj3zYohIfX4JqGbYMVKVir4BbIyje9r8
bucketName: myproject
package com.qfedu.springbootminio.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* minio属性类
*/
@Data
// 通过指定的前缀,绑定配置文件中的配置
@ConfigurationProperties(prefix = "minio")
public class MinioProperties {
/**
* 端点
*/
private String endpoint;
private String accessKey;
private String secretKey;
/**
* 桶名称
*/
private String bucketName;
}
package com.qfedu.springbootminio.config;
import io.minio.MinioClient;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* minio配置类
*/
@Component
// 使@ConfigurationProperties注解修饰的类生效,
// 或者不使用该注解,但是在@ConfigurationProperties注解修饰的类上使用@Component
@EnableConfigurationProperties(MinioProperties.class)
public class MinioConfig {
@Resource
private MinioProperties minioProperties;
/**
* 创建 MinIO 客户端
*/
@Bean
public MinioClient getMinioClient() {
MinioClient minioClient = MinioClient.builder().endpoint(minioProperties.getEndpoint())
.credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey())
.build();
return minioClient;
}
}
minio的操作类
package com.qfedu.springbootminio.config;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
/**
* minio工具类
*/
@Component
public class MinioUtil {
@Value("${minio.bucketName}")
private String bucketName;
@Autowired
private MinioClient minioClient;
/**
* 判断bucket是否存在,不存在则创建
*/
public void existBucket(String name) {
try {
boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build());
if (!exists) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build());
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 文件上传
*
* @param file
* @return
*/
public String upload(MultipartFile file) {
// 如果桶不存在,直接创建
existBucket(bucketName);
// 获取原始文件名
String fileName = file.getOriginalFilename();
// 修改文件名,按照指定的规则修改,本例增加了一个时间戳
String[] split = fileName.split("\\.");
if (split.length > 1) {
fileName = split[0] + "_" + System.currentTimeMillis() + "." + split[1];
} else {
fileName = fileName + System.currentTimeMillis();
}
InputStream in = null;
try {
in = file.getInputStream();
// 上传到minio
minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName) //.bucket("img/" + bucketName)
.object(fileName)
.stream(in, in.available(), -1)
.contentType(file.getContentType())
.build()
);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 返回上传的文件名
return fileName;
}
}
测试控制器
package com.qfedu.springbootminio.config;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
@RestController
public class TestController {
@Resource
private MinioUtil minioUtil;
@PostMapping("/upload")
public String upload(MultipartFile multipartFile) {
return minioUtil.upload(multipartFile);
}
}
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
@RestController
public class TestController {
@Resource
private MinioUtil minioUtil;
@PostMapping("/upload")
public String upload(MultipartFile multipartFile) {
return minioUtil.upload(multipartFile);
}
}