跳转至

MinIO#

约 521 个字 39 行代码 3 张图片 预计阅读时间 11 分钟

安装#

免费版与收费版#

仓库下的README文件中获取地址:


github

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


官网提供的地址下载,需要许可证才能使用

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" &
关闭服务
# 查询服务
ps -ef | grep minio

# 根据id关闭服务
kill xxxx

Docker下安装#

镜像地址

Bash
# 拉取镜像
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下安装#


github README文档

要在 64 位 Windows 主机上运行 MinIO,请从以下网址下载 MinIO 可执行文件:

https://dl.min.io/server/minio/release/windows-amd64/minio.exe

在 Windows 主机上运行独立 MinIO 服务器,请使用以下命令。将 D:\ 替换为您希望 MinIO 存储数据的驱动器或目录路径。您必须将终端或 PowerShell 的目录更改为 minio.exe 可执行文件所在的位置,或者将该目录的路径添加到系统 $PATH:

Bash
minio.exe server D:\

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依赖。
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 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对象
Config.java
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操作#

BucketTest.java
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());
    }
}

对象操作#

ObjectTest.java
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());
    }

}

评论