Bootstrap

.NET6环境中MinIO的基本使用

一、MinIO简介

        MinIO是一个对象存储解决方案,它提供了与Amazon Web Services S3兼容的API,并支持所有核心S3功能。 MinIO有能力在任何地方部署 - 公有云或私有云,裸金属基础设施,编排环境,以及边缘基础设施。MinIO 允许你存储非结构化数据(如图片、视频、日志文件等)以对象的形式。与传统的文件系统(如NFS)或块存储(如iSCSI)相比,对象存储更易于扩展和管理。MinIO 提供简单的部署选项和易于使用的界面,允许你快速设置和访问存储资源。

二、安装

注:本文使用的是Docker安装,如需其它方式安装,请自行查阅。

1、查看MinIO镜像

docker search minio

在控制台中输入 “docker search minio”命令即可。

2、下载MinIO镜像

docker pull minio/minio

同样在控制台中输入“docker pull minio/minio” 命令,然后等待下载完成即可。下载完成后可在Docker Desktop中查看,也可以在控制台中输入“docker images”命令查看。

3、创建MinIO启动容器
docker run -p 9000:9000 -p 9090:9090 \
 --name minio \
 -d --restart=always \
 -e "MINIO_ACCESS_KEY=minioadmin" \
 -e "MINIO_SECRET_KEY=minioadmin" \
 -v /mydata/minio/data:/data \
 minio/minio server \
 /data --console-address ":9090" -address ":9000"

1、说明:

  • 命令中的“\”是指命令还没有输入完,还要继续输入,先不要执行的意思。 
  • -p 设置容器的映射端口。
  • -name xxx 是容器名称。
  • -d --restart=always 代表重启linux的时候容器自动启动。
  • -e "MINIO_ACCESS_KEY:xxx"和-e "MINIO_SECRET_KEY:xxx"分别指用户名和用户密码
  • -v 则指docker run当中的挂载,这里的/root/docker/minio/data:/data意思就是将容器的/data目录和宿主机的/root/docker/minio/data目录做映射。
  • –console-address 客户端端口。
  • -address api端口

注:无“\”的命令

docker run -p 9000:9000 -p 9090:9090 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=minioadmin" -e "MINIO_SECRET_KEY=minioadmin" -v /mydata/minio/data:/data minio/minio server /data --console-address ":9090" -address ":9000"

2、查看容器

 同样也可以通过Docker Desktop和控制台两种方式查看。

控制台查看命令:

docker ps -a

4、登录MinIO控制台 

通过ip+映射端口访问控制台:http://localhost:9090,然后输入设置好的用户名和密码登录即可。

三、在.net环境中向MinIO上传数据 

我使用的环境为.net6,其他版本请酌情参考。

1、创建一个Worker Service项目,并在NuGet中下载minio SDK(我使用的是6.01版本)

2、在配置文件中设置MinIO配置
/********MinIO配置********/
"MinioSettings": {
  /********服务器IP********/
  "Endpoint": "localhost:9000",
  /********访问key********/
  "AccessKey": "rEoSXW2TBUKLjg1XRgqT",
  /********访问秘钥********/
  "SecretKey": "oew3HeN6PBCf1yWHMqBoWJgievbeXAKlS98ycdBl"
}
 3、在Program.cs中添加Minio服务
services.AddMinio(minioClient => 
    minioClient.WithEndpoint(context.Configuration["MinioSettings:Endpoint"])
    .WithCredentials(context.Configuration["MinioSettings:AccessKey"], context.Configuration["MinioSettings:SecretKey"])
);
 4、上传指定文件
public async Task Run(List<FileInfo> files, string? bucket)
{
    try
    {
        // 验证桶是否存在
        BucketExistsArgs? beArgs = new BucketExistsArgs().WithBucket(bucket);
        bool found = await _minioClient.BucketExistsAsync(beArgs).ConfigureAwait(false);

        // 如果桶不存在则创建桶
        if (!found)
        {
            var mbArgs = new MakeBucketArgs().WithBucket(bucket);
            await _minioClient.MakeBucketAsync(mbArgs);
        }

        foreach (FileInfo file in files)
        {
            // 获取文件的mime类型
            string contentType = MimeTypes.GetMimeType(file.Name);

            var putObjectArgs = new PutObjectArgs()
                .WithBucket(bucket)
                .WithObject(file.Name)
                .WithFileName(file.FullName)
                .WithObjectSize(file.Length)
                .WithContentType(contentType);

            await _minioClient.PutObjectAsync(putObjectArgs).ConfigureAwait(false);
        }
    }
    catch (Exception exp)
    {
        _logger.LogError($"文件上传出错,详细信息:{exp.Message}");
    }
}

 上传结果可在控制台中查看:

;