MinIO使用

Minio安装运行:

一、拉取MinIO镜像

docker pull minio/minio

二、创建挂载目录

1 宿主机与容器挂载映射
宿主机位置 容器位置
/data/minio/config /data
/data/minio/data /root/.minio
2 挂载命令执行
mkdir -p /data/minio/config
mkdir -p /data/minio/data

三、运行MinIO

docker run -p 9000:9000 -p 9090:9090 --name minio
-d --restart=always
-e "MINIO_ACCESS_KEY=admin"
-e "MINIO_SECRET_KEY=admin123456"
-v /data/minio/data:/data
-v /data/minio/config:/root/.minio \minio/minio
server /data --console-address ":9090"

命令参数解释:

-d :后台启动
-p :端口映射
-name :为这个容器取一个名字
-e :设置环境变量
-v :文件挂载位置
–console-address “:9090” :选择静态端口号,这里注意下控制台端口号不能和静态端口号一样

四、查看MinIO是否启动成功

打开 http://ip:9090
密码为上面设置的admin admin123456

DotnetCore简单调用MInIO

准备

这里我们要先创建个桶(Bucket),命名为test

.NET Core集成

这里都是围绕这minio官方提供的.net SDK进行扩展使用,更多详情可以参考官网http://docs.minio.org.cn/docs/master/dotnet-client-quickstart-guide

创建个webapi项目,并添加Minio的NuGet包,这里我选3.1.13版本
将Minio注入进来,并将minio连接信息配置在appsetting,json文件中
Startup.cs

   public void ConfigureServices(IServiceCollection services)
        {
            #region minio客户端注入
            var minioClient = new MinioClient(Configuration["MinIO:Endpoint"]
                , Configuration["MinIO:AccessKey"]
                , Configuration["MinIO:SecretKey"]);
            services.AddSingleton(minioClient);
            #endregion
            services.AddControllers();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "MinioDemo.WebApi", Version = "v1" });
            });
        }

appsetting.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  //minIO配置
  "MinIO": {
    //服务器IP
    "Endpoint": "localhost:9090",
    //账号
    "AccessKey": "minioadmin",
    //密码
    "SecretKey": "12345678",
    //默认存储桶
    "Bucket": "test"
  }
}

上传、下载代码

private static string bucketName = "test";//默认桶
private readonly MinioClient _client;
public MinIOController(MinioClient client)
{
_client = client;
}
///


/// 上传附件
///

///
///
[HttpPost("/file/UploadFile")]
public async Task UploadFile(List files)
{
long size = files.Sum(f => f.Length);
try
{
bool found = await _client.BucketExistsAsync(bucketName);
//如果桶不存在则创建桶
if (!found)
{
await _client.MakeBucketAsync(bucketName);
}
foreach (var formFile in files)
{
string saveFileName = $"{Guid.NewGuid():N}{Path.GetExtension(formFile.FileName)}";//存储的文件名
string objectName = $"/{DateTime.Now:yyyy/MM/dd}/{saveFileName}";//文件保存路径
if (formFile.Length > 0)
{
Stream stream = formFile.OpenReadStream();
await _client.PutObjectAsync(bucketName,
objectName,
stream,
formFile.Length,
formFile.ContentType);
}
}
}
catch (MinioException e)
{
Console.WriteLine("文件上传错误: {0}", e.Message);
}
return Ok(new { count = files.Count, size });
}

///


/// 下载附件
///

///
///
[HttpGet("/file/DownloadFile")]
public async Task DownloadFile(string fileName)
{
var memoryStream = new MemoryStream();

try
{
await _client.StatObjectAsync(bucketName, fileName);
await _client.GetObjectAsync(bucketName, fileName,
(stream) =>
{
stream.CopyTo(memoryStream);
});
memoryStream.Position = 0;

}
catch (MinioException e)
{
Console.Out.WriteLine("下载附件发生错误: " + e);
}
return File(memoryStream, GetContentType(fileName));

}
private static string GetContentType(string fileName)
{
if (fileName.Contains(".jpg"))
{
return "image/jpg";
}
else if (fileName.Contains(".jpeg"))
{
return "image/jpeg";
}
else if (fileName.Contains(".png"))
{
return "image/png";
}
else if (fileName.Contains(".gif"))
{
return "image/gif";
}
else if (fileName.Contains(".pdf"))
{
return "application/pdf";
}
else
{
return "application/octet-stream";
}
}
}
}

测试

上传测试,这里我用swagger执行测试UploadFile

minio控制台,成功

下载测试,这里直接拿刚刚上传成功的附件进行测试

扩展:更改访问策略,实现直接打开浏览文件
如果想要通过url地址直接打开文件,只需要改访问策略
进入minio控制台=》Buckets=>Manage=>Access Policy: Public

注:MinIO版本4以上不能使用以上方式进行初始化客户端

posted @ 2023-04-14 10:53  渡——已  阅读(713)  评论(0)    收藏  举报