一、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}");
}
}
上传结果可在控制台中查看: