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;
    }
    /// <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以上不能使用以上方式进行初始化客户端

作者:gongxingwen

出处:https://www.cnblogs.com/dotnetSunset/p/17317647.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   渡——已  阅读(612)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示