MinIO对象存储服务快速搭建与应用
1.环境准备
1.1.Linux版本
cat /etc/centos-release
-> CentOS Linux release 7.9.2009 (Core)
uname -r
-> 3.10.0-1160.el7.x86_64
1.2.Docker版本
docker -v
-> Docker version 25.0.1, build 29cf629
这里下载时未指定Docker版本,则为当时下载为最新版本。
2.Docker拉取镜像创建容器
shell
docker run -d \
-p 9000:9000 \
-p 9001:9001 \
--name minio --restart=always --privileged=true \
-v /minio/data:/data \
-e "MINIO_ROOT_USER=用户名" \
-e "MINIO_ROOT_PASSWORD=密码" \
minio/minio server /data --console-address ":9001"
-
用户名和密码为MinIO浏览器登录的用户名和密码,请自定义配置。
-
/minio/data 目录为Docker所在的宿主机的目录。
运行结果如下


访问MinIO所在的机器IP + 9001 端口号。

进入到MinIO控制台首页,可以关注一下MinIO的版本,以及一会用到的桶和用户。

以上就快速搭建完成了一个单体应用的MinIO应用服务。
3.MinIO应用服务配置
例如:需要上传头像相关的照片到服务中存储。
3.1.创建桶
创建桶,俗话创建某业务的顶级目录。


直接跳到了刚刚创建桶的根目录下


3.2.创建操作桶的用户


记录一下我刚刚设置的:
AK:ContentManager
SK:ContentManagerContentManager

以上操作,对于粗粒度来说,已经准备的差不多了。开始进入代码层。
4.创建SpringBoot项目
4.1.引入MinIO坐标
xml
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.7</version>
</dependency>
是web项目喔,记得导入web相关坐标
4.2.创建MinIO相关属性配置类和配置文件所对应
java
@ConfigurationProperties(prefix = "app.minio")
@Component
@Data
public class MinioPropertiesConfig {
private String baseUrl;
private String endpoint;
private String bucket;
private String accessKey;
private String secretKey;
}
yaml
app:
minio:
# 访问资源的 URL
base-url: "http://192.168.3.85:9000"
# API 端点
endpoint: "http://192.168.3.85:9000"
# 上传的 Bucket 桶
bucket: head-portrait
# Access Key
access-key: ContentManager
# Secret Key
secret-key: ContentManagerContentManager
4.3.创建MinIO配置类
java
@SpringBootConfiguration
public class MinioConfig {
@Autowired
private MinioPropertiesConfig minioPropertiesConfig;
@Bean
public MinioClient minioClient(){
return MinioClient.builder()
.endpoint(minioPropertiesConfig.getEndpoint())
.credentials(minioPropertiesConfig.getAccessKey(), minioPropertiesConfig.getSecretKey())
.build();
}
}
4.4.创建文件上传接口
java
@RestController
public class UploadController {
@Autowired
private MinioClient minioClient;
@Autowired
private MinioPropertiesConfig minioPropertiesConfig;
/**
* 上传文件 名称必须为 file
*
* @return 主要返回上传后可访问的文件路径
*/
@PostMapping("/upload")
public Map<String, Object> upload(MultipartFile file) throws Exception {
Map<String, Object> map = new HashMap<>();
// 1 判断文件的合法
if (Objects.isNull(file) || file.getSize() == 0) {
map.put("msg", "文件不能为空");
return map;
}
// 可以自定义业务 例如:检查文件的大小 文件的类型 文件的md5等
// 获取文件的基本信息
String filename = file.getOriginalFilename();
long fileSize = file.getSize();
String fileContentType = file.getContentType();
// 文件名称去重处理(这里简单处理)
filename = System.currentTimeMillis() + "_" + filename;
// 生成需要的上传到云服务的目录(根据业务要求来)
LocalDate now = LocalDate.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
String filePath = String.format("%d/%d/%d/%s", year, month, day, filename);
// 2 检查云存储服务的正常
boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioPropertiesConfig.getBucket()).build());
if (!exists) {
// 桶不存在 可以创建桶
minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioPropertiesConfig.getBucket()).build());
}
// 3 上传文件
try (InputStream inputStream = file.getInputStream()) {
minioClient.putObject(PutObjectArgs.builder()
// 指定 Bucket
.bucket(minioPropertiesConfig.getBucket())
// 指定 ContentType
.contentType(fileContentType)
// 指定文件的路径
.object(filePath)
// 文件的 inputStream 流
.stream(inputStream, fileSize, -1)
.build());
}
// 4 返回文件访问路径
String fileURL = minioPropertiesConfig.getBaseUrl() + "/" + minioPropertiesConfig.getBucket() + "/" + filePath;
// 封装返回结果
map.put("fileURL", fileURL);
return map;
}
}
4.5.PostMan工具测试接口

访问返回的云服务存储访问文件地址时:权限不足。

此时就需要开启桶的匿名只读功能


然后就可以访问图片资源啦

观察MinIO桶内的数据

5.测试其他资源功能
5.1.上传zip格式文件

也是上传成功,访问返回的地址,浏览器可自动识别进行下载此资源。

5.2.测试上传视频资源



浏览器访问视频资源则直接播放。
关于MinIO服务的其他高级功能,该篇文章就不记录了
- MinIO集群部署
- MinIO读写压力测试
- MinIO文件细粒度权限控制
- ...高级玩法
备注:该文章用于自我在文件存储功能上的基础实现记录,以及分享给需要搭建基础文件服务的同学们,曾经我也搭建和使用过FastDFS,那时候感觉到安装部署挺麻烦的,也没有继续使用了,直到接触到MinIO应用服务,听到是对标例如AL的OSS服务,再见。