背景简介
MinIO 是一个基于 Go 实现的轻量高性能、兼容 S3 协议的对象存储。它采用 GNU AGPL v3 开源协议,项目地址是 https://github.com/minio/minio,官网是 https://min.io。下载地址 https://min.io/download
它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据。 例如图片、音频、视频、日志文件等常见文件,备份数据、容器、虚拟机镜像等等,而一个对象文件可以是任意大小,从几 kb 到最大 5T 不等。
国内阿里巴巴、腾讯、百度、华为、中国移动、中国联通等企业在使用 MinIO,甚至不少商业公司二次开发 MinIO 来提供商业化的云存储产品。
使用步骤
新建存储桶
点击 Create Bucket 按钮,新建一个 Bucket 存储桶,用于稍后文件的上传,如下图所示:
添加 readonly 访问规则
默认配置下,访问存储桶是需要请求授权的。但是在实际场景下,我们往往希望允许直接访问,此时就需要添加一条 readonly 访问规则。
选择一个 bucket 进入,点击 Anonymous Access 菜单,接着点击 Add Access Rule 按钮,,如下图所示:
添加一条 Prefix 为 /
Access 为 readonly
的规则,如下图所示:
文件上传
点击 Object Browser 菜单,选择目标 bucket,点击进去,如下图所示:
根据需求点击上传,如下图所示:
文件访问
# http://ip:port/{bucket}/{name},注意:这里的端口号是服务端的端口号,不是管理页面的端口号
http://8.134.132.250:9000/tiger/微信图片_20230209194634.jpg
MinIO Client 命令行工具
# 安装命令行客户端工具,切换到 hostname my-mc
docker run --name my-mc --hostname my-mc -it --entrypoint /bin/bash --rm minio/mc
# 设置别名 mc alias set myminio/ https://ip:服务端端口 AccessKey Secret Key
[root@my-mc /] mc alias set myminio/ http://8.134.132.250:9000 S8gzmHL4dz1wsRsr n7GddOSf8shLmUFstwO9alLISbGFLXWc
# 列出文件和文件夹
[root@my-mc /] mc ls myminio/mybucket
MinIO Client (mc) 是 MinIO 提供的命令行工具,用于访问 MinIO Server。它的命令设计的非常棒,和我们在使用 ls、cat、cp、mirror、diff、find 等 Unix 命令基本接近,主要如下:
ls 列出文件和文件夹
mb 创建一个存储桶或一个文件夹
cat 显示文件和对象内容
pipe 将一个 STDIN 重定向到一个对象或者文件或者 STDOUT
share 生成用于共享的 URL
cp 拷贝文件和对象
mirror 给存储桶和文件夹做镜像
find 基于参数查找文件
diff 对两个文件夹或者存储桶比较差异
rm 删除文件和对象
events 管理对象通知
watch 监听文件和对象的事件
policy 管理访问策略
session 为 cp 命令管理保存的会话
config 管理 mc 配置文件
update 检查软件更新
version 输出版本信息
- MinIO Client 安装:https://min.io/download
- MinIO Client 命令:https://docs.min.io/minio/baremetal/reference/minio-mc.html
整合 springboot
引入依赖
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>tiger-minio</artifactId>
<dependencies>
<!-- 实现对 Spring MVC 的自动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MinIO 客户端 -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.2</version>
</dependency>
</dependencies>
</project>
配置类
MinIOConfiguration.java
package tiger.springboot.minio.config;
import io.minio.MinioClient;
import org.springframework.context.annotation.*;
@Configuration
public class MinIOConfiguration {
@Bean
public MinioClient minioClient() {
// Minio 配置。实际项目中,定义到 application.yml 配置文件中
String endpoint = "http://ip:9000";
String accessKey = "xxx";
String secretKey = "xxx";
// 创建 MinioClient 客户端
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}
配置文件
application.yaml
spring:
application:
name: demo-minio # Spring 应用名
servlet:
multipart:
max-file-size: 50MB
max-request-size: 50MB
server:
port: 8080 # 服务器端口。默认为 8080
FileController
实现上传与删除接口
package tiger.springboot.minio.controller;
import io.minio.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.UUID;
@RestController
@RequestMapping("/file")
public class FileController {
@Resource
private MinioClient minioClient;
// Minio 配置。实际项目中,定义到 application.yml 配置文件中
private String endpoint = "http://8.134.132.250:9000";
// private String bucket = "tiger";
/**
* 上传文件
*/
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file, @RequestParam("bucket") String bucket) throws Exception {
// 文件名 = UUID + 原始文件名
// String path = System.currentTimeMillis() + "_" + file.getOriginalFilename();
String path = file.getOriginalFilename();
minioClient.putObject(PutObjectArgs.builder()
// 存储桶
.bucket(bucket)
// 文件名
.object(path)
// 文件内容
.stream(file.getInputStream(), file.getSize(), -1)
// 文件类型
.contentType(file.getContentType()).build());
// 拼接路径
return String.format("%s/%s/%s", endpoint, bucket, path);
}
/**
* 删除文件
*/
@DeleteMapping("/delete")
public String delete(@RequestParam("path") String path, @RequestParam("bucket") String bucket) throws Exception {
minioClient.removeObject(RemoveObjectArgs.builder()
// 存储桶
.bucket(bucket)
// 文件名
.object(path).build());
return String.format("删除成功:%s/%s/%s", endpoint, bucket, path);
}
}
启动类
MinIOApplication.java
package tiger.springboot.minio;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MinIOApplication {
public static void main(String[] args) {
SpringApplication.run(MinIOApplication.class, args);
}
}
测试
上传示例(上传成功后,可以在管理界面查询到)。
删除示例