MinIO使用

发布时间 2023-04-14 10:56:35作者: 渡——已

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"
}
}

完整上传、下载代码
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Minio;
using Minio.Exceptions;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;

namespace MinioDemo.WebApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class MinIOController : ControllerBase
{

   private static string bucketName = "test";//默认桶
   private readonly MinioClient _client;
    public MinIOController(MinioClient client)
    {
        _client = client;
    }
    /// <summary>
    /// 上传附件
    /// </summary>
    /// <param name="files"></param>
    /// <returns></returns>
    [HttpPost("/file/UploadFile")]
    public async Task<dynamic> UploadFile(List<IFormFile> 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 });
    }


    /// <summary>
    /// 下载附件
    /// </summary>
    /// <param name="fileName"></param>
    /// <returns></returns>
    [HttpGet("/file/DownloadFile")]
    public async Task<IActionResult> 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以上不能使用以上方式进行初始化客户端