MinIO#
约 521 个字 39 行代码 3 张图片 预计阅读时间 11 分钟
安装#
免费版与收费版#
去仓库下的README文件中获取地址:

官网好像找不到免费地址了,这个地址下载需要许可证才能运行:

Centos下安装#
# 下载文件
wget https://dl.min.io/server/minio/release/linux-amd64/minio
# 为文件提供可执行权限
chmod +x minio
# MINIO_ROOT_USER 指定用户名
# MINIO_ROOT_PASSWORD 指定密码
# /mnt/data 指定数据存储目录
# --console-address ":9001" 指定网页控制台端口
# & 后台运行
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=12345678 ./minio server /mnt/data --console-address ":9001" &
Docker下安装#
# 拉取镜像
docker pull minio/minio
# 启动容器
docker run -p 9000:9000 -p 9001:9001 \
minio/minio server /data --console-address ":9001"
# 自定义参数启动
docker run -p 9000:9000 -p 9090:9090 \
--name minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=admin" \ #自定义MINIO_ACCESS_KEY
-e "MINIO_SECRET_KEY=admin123456" \ #自定义MINIO_SECRET_KEY
-v /root/docker/minio/data:/data \
-v /root/docker/minio/config:/root/.minio \
minio/minio server\
/data --console-address ":9090" -address ":9000" #9000 服务端口; 9090 web端控制台端口(两个端口都可以自定义)
Windows下安装#

要在 64 位 Windows 主机上运行 MinIO,请从以下网址下载 MinIO 可执行文件:
https://dl.min.io/server/minio/release/windows-amd64/minio.exe
在 Windows 主机上运行独立 MinIO 服务器,请使用以下命令。将 D:\ 替换为您希望 MinIO 存储数据的驱动器或目录路径。您必须将终端或 PowerShell 的目录更改为 minio.exe 可执行文件所在的位置,或者将该目录的路径添加到系统 $PATH:
MinIO 部署开始时使用默认的根凭证 minioadmin:minioadmin
。您可以通过 MinIO 控制台测试部署,这是一个嵌入在 MinIO 服务器中的基于网页的对象浏览器。在主机上运行的网络浏览器中输入 http://127.0.0.1:9000
,并使用根凭证登录。您可以使用浏览器创建存储桶、上传对象以及浏览 MinIO 服务器的内容。
您还可以使用任何兼容 S3 的工具进行连接,例如 MinIO 客户端 mc 命令行工具。有关使用 mc 命令行工具的更多信息,请参阅使用 MinIO 客户端 mc 进行测试。对于应用程序开发人员,请访问 https://min.io/docs/minio/linux/developers/minio-drivers.html 查看支持语言的 MinIO SDK。
Note
独立的 MinIO 服务器最适合早期开发和评估。某些功能如版本控制、对象锁定和存储桶复制需要通过分布式部署 MinIO 并启用纠删码来实现。对于扩展开发和生产环境,建议部署启用纠删码的 MinIO,每台 MinIO 服务器至少需要 4 个驱动器。有关更完整的文档,请参阅 MinIO 纠删码概述。
入门案例#
- 创建springboot项目,引入minio依赖。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.upda</groupId>
<artifactId>minio-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>minio-demo</name>
<description>minio-demo</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--引入minio依赖-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.14</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 创建
MinioClient
对象
package com.upda.miniodemo.config;
import io.minio.MinioClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author luguosong
*/
@Configuration
public class Config {
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint("http://127.0.0.1:9000")
.credentials("minioadmin", "minioadmin")
.build();
}
}
Bucket操作#
package com.upda.miniodemo;
import io.minio.*;
import io.minio.errors.*;
import io.minio.messages.Bucket;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.List;
/**
* @author luguosong
*/
@SpringBootTest
public class BucketTest {
@Resource
private MinioClient minioClient;
/*
* 判断Bucket是否存在
* */
@Test
void isBucketExist() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("test-bucket").build());
System.out.println(exists);
}
/*
* 创建Bucket
* */
@Test
void createBucket() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("test-bucket").build());
if (!exists) {
// 创建Bucket
minioClient.makeBucket(MakeBucketArgs.builder().bucket("test-bucket").build());
} else {
System.out.println("Bucket已存在");
}
}
/*
* 自定义Bucket策略
* */
@Test
void setBucketPolicy() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
// 自定义Bucket策略
String policyJson = "{\n" +
" \"Statement\": [\n" +
" {\n" +
" \"Action\": [\n" +
" \"s3:GetBucketLocation\",\n" +
" \"s3:ListBucket\"\n" +
" ],\n" +
" \"Effect\": \"Allow\",\n" +
" \"Principal\": \"*\",\n" +
" \"Resource\": \"arn:aws:s3:::test-bucket\"\n" +
" },\n" +
" {\n" +
" \"Action\": \"s3:GetObject\",\n" +
" \"Effect\": \"Allow\",\n" +
" \"Principal\": \"*\",\n" +
" \"Resource\": \"arn:aws:s3:::test-bucket/myobject*\"\n" +
" }\n" +
" ],\n" +
" \"Version\": \"2012-10-17\"\n" +
"}";
minioClient.setBucketPolicy(
SetBucketPolicyArgs
.builder()
.bucket("test-bucket")
.config(policyJson)
.build());
}
/*
* 遍历Bucket
* */
@Test
void listBucket() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
List<Bucket> list = minioClient.listBuckets();
list.forEach(bucket -> System.out.println(bucket.name()));
}
/*
* 删除Bucket
* */
@Test
void removeBucket() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
minioClient.removeBucket(RemoveBucketArgs.builder().bucket("test-bucket").build());
}
}
对象操作#
package com.upda.miniodemo;
import io.minio.*;
import io.minio.errors.*;
import io.minio.http.Method;
import io.minio.messages.Item;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.concurrent.TimeUnit;
/**
* @author luguosong
*/
@SpringBootTest
public class ObjectTest {
@Resource
private MinioClient minioClient;
/*
* 判断文件是否存在
*
* 如果文件不存在,会抛出异常
* */
@Test
void isExist() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
StatObjectResponse response = minioClient.statObject(StatObjectArgs.builder().
bucket("test-bucket").
object("sample.txt").build());
System.out.println(response);
}
/*
* 文件上传
* */
@Test
void putObject() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
File file = new File(getClass().getClassLoader().getResource("sample.txt").getFile());
minioClient.putObject(PutObjectArgs.builder()
.bucket("test-bucket")
.object("sample.txt")
.stream(new FileInputStream(file), file.length(), -1)
.build());
}
/*
* 获取文件访问路径
* */
@Test
void getFilePath() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
//获取对象的预签名 URL 用于 HTTP 方法、到期时间和自定义请求参数。
String url = minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.bucket("test-bucket") //桶
.object("sample.txt") //文件名
.expiry(3, TimeUnit.MINUTES) //设置链接有效时间为3分钟
.method(Method.GET) // GET 方法
.build());
System.out.println(url);
}
/*下载文件
* */
@Test
void getFile() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
GetObjectResponse response = minioClient.getObject(
GetObjectArgs
.builder()
.bucket("test-bucket")
.object("sample.txt")
.build());
response.transferTo(new FileOutputStream("./sample_download.txt"));
}
/*
* 遍历文件
* */
@Test
void listObject() {
Iterable<Result<Item>> listObjects = minioClient.listObjects(
ListObjectsArgs.builder()
.bucket("test-bucket")
.build());
listObjects.forEach(itemResult -> {
Item item = null;
try {
item = itemResult.get();
System.out.println(item.objectName());
} catch (Exception e) {
throw new RuntimeException(e);
}
});
}
/*
* 删除文件
* */
@Test
void removeObject() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
minioClient.removeObject(
RemoveObjectArgs
.builder()
.bucket("test-bucket")
.object("sample.txt")
.build());
}
}