.net 8 集成 MinIO文件存储服务,实现bucket管理,以及文件对象的基本操作

一、准备工作

1、本地部署MinIO服务

2、创建MinIO的Access Key

3、创建.net 项目

4、下载MinIO sdk

5、相关文档

二、编写MinIO工具类

三、管理存储桶

1、MyBucket类

(1)判断bucket是否存在

(2)新建bucket

(3)删除bucket 

(4)获取bucket列表

2、BucketController

3、实现效果

(1)判断bucket是否存在

(2)新建bucket

(3)删除bucket

(4)获取bucket列表

四、管理文件

1、MyObject类

(1)下载文件对象

(2)上传文件对象

(3)删除文件对象

(4)获取文件对象URL

2、ObjectController 

3、实现效果

(1)下载指定文件

(2)上传指定文件

(3)删除指定文件 

(4)获取指定文件URL 


一、准备工作

1、本地部署MinIO服务

需要在本地部署MinIO,并启动服务;可以参考这篇文章

Windows部署MinIO,搭建本地对象存储服务-CSDN博客

2、创建MinIO的Access Key

在MinIO控制台,选择【Access Keys】,点击【Create access key】;

点击【Create】创建用于连接MinIO服务的Key和Secret(很重要,一定要另存下来);

3、创建.net 项目

打开Visual Studio,新建项目,选择Web Api框架

选择.net8.0

4、下载MinIO sdk

使用NuGet包管理器找到并安装MinIIO的sdk,如下图所示,

这里安装的是最新版6.0.2;

5、相关文档

.NET API 开发文档(英文)

.NET API 参考文档(中文)

以官网的英文文档为主,中文文档为辅;

二、编写MinIO工具类

在代码中编写一个用来连接MinIO服务的工具类【MinIO.cs】,放在项目的【Helper】文件夹中;

【Helper/MinIO.cs】

using Minio;namespace Zyl_MinIO_Demo.Helper
{public class MinIO{private static string endPoint = "127.0.0.1:9001";  private static string accessKey = "连接minio服务的key";   private static string secretKey= "连接minio服务的secret";private static bool secure = false; public static MinioClient CreateMinioClient(){MinioClient minioClient = (MinioClient)new MinioClient().WithEndpoint(endpoint).WithCredentials(accessKey, secretKey).WithSSL(secure)   .Build();return minioClient;}}
}
// 该方法用来初始化MinIO对象。
MinioClient minioClient = new MinioClient().WithEndpoint(endPoint).WithCredentials(accessKey, secretKey).WithSSL(secure).Build(); 
  • endPoint :MinIO服务启动的URL,注意自己启动服务的端口号;

  • accessKey :在MinIO控制台申请的Access Key;
  • secretKey:在MinIO控制台申请的Access Secret;

  • secure :布尔值(默认值  true),是否启用HTTPS;

三、管理存储桶

1、MyBucket类

在【Managers】文件夹中新建【MyBucket】类,用来管理存储桶;

【Managers/MyBucket.cs】

using Minio.DataModel.Args;
using Minio.Exceptions;
using Minio;
using Zyl_MinIO_Demo.Helper;
using Minio.DataModel.Result;namespace Zyl_MinIO_Demo.Managers
{public class MyBucket{// 实例化 minioClientprivate static MinioClient minioClient = MinIO.CreateMinioClient();/// <summary>/// 1、判断bucket是否存在/// </summary>/// <param name="bucketName"></param>/// <returns></returns>public static async Task<string> IsExistStr(string bucketName){try{BucketExistsArgs args = new BucketExistsArgs().WithBucket(bucketName);bool found = await minioClient.BucketExistsAsync(args).ConfigureAwait(false);Console.WriteLine("found。。。。。。", found);if (found){Console.WriteLine($"{bucketName}桶已存在");return $"{bucketName}桶已存在";}else{Console.WriteLine($"{bucketName}桶不存在");return $"{bucketName}桶不存在";}}catch (MinioException e){Console.WriteLine("[Bucket]  Exception: {0}", e);return "出错啦!!!";}}/// <summary>/// 2、创建一个bucket/// </summary>/// <param name="bucketName"></param>/// <returns></returns>public static async Task<string> Create(string? bucketName){try{BucketExistsArgs args = new BucketExistsArgs().WithBucket(bucketName);bool found = await minioClient.BucketExistsAsync(args).ConfigureAwait(false);if (found){return $"{bucketName}桶已存在";}else{MakeBucketArgs makeBucketArgs = new MakeBucketArgs().WithBucket(bucketName);await minioClient.MakeBucketAsync(makeBucketArgs).ConfigureAwait(false);return $"{bucketName}桶已成功创建";}}catch (MinioException e){Console.WriteLine("[Bucket]  Exception: {0}", e);return "出错啦!!!";}}/// <summary>/// 3、移除一个bucket/// </summary>/// <param name="bucketName"></param>/// <returns></returns>public static async Task<string> Delete(string? bucketName){try{BucketExistsArgs args = new BucketExistsArgs().WithBucket(bucketName);bool found = await minioClient.BucketExistsAsync(args).ConfigureAwait(false);if (!found){return $"{bucketName}桶不存在";}else{RemoveBucketArgs removeBucketArgs = new RemoveBucketArgs().WithBucket(bucketName);await minioClient.RemoveBucketAsync(removeBucketArgs);return $"{bucketName}桶删除成功";}}catch (MinioException e){Console.WriteLine("[Bucket]  Exception: {0}", e);return "出错啦!!!";}}/// <summary>/// 4、获取已有的bucket列表/// </summary>/// <returns></returns>public static async Task<ListAllMyBucketsResult?> GetList(){try{return await minioClient.ListBucketsAsync();}catch (MinioException e){Console.WriteLine("Error occurred: " + e);return null ;}}}
}

(1)判断bucket是否存在

Task<bool> BucketExistsAsync(BucketExistsArgs args)
  • 判断一个指定名称的存储桶是否存在
  • 返回一个布尔值true(存在),或false(不存在); 

(2)新建bucket

Task MakeBucketAsync(MakeBucketArgs args)
  • 创建一个指定名称的存储桶;
  • 创建失败,则返回异常信息;

(3)删除bucket 

Task RemoveBucketAsync(RemoveBucketArgs args)
  • 移除一个指定名称的存储桶;
  • 任务返回移除失败时的异常信息;
  • 当桶中有内容时,则不会被删除;

(4)获取bucket列表

Task<ListAllMyBucketsResult> ListBucketsAsync()
  • 用来获取buckets列表数据; 

2、BucketController

在Controllers文件夹下,新建一个空的API控制器,用来给前端人员暴露接口;

【Controllers/BucketController.cs】

using Microsoft.AspNetCore.Mvc;
using Minio;
using Minio.DataModel.Result;
using Zyl_MinIO_Demo.Managers;namespace Zyl_MinIO_Demo.Controllers
{/// <summary>/// 管理 MinIO 中的 Bucket/// </summary>[Route("api/[controller]/[action]")][ApiController]public class BucketController : ControllerBase{/// <summary>/// 1、判断指定bucket是否存在/// </summary>/// <param name="bucketName">bucket 名称</param>/// <returns></returns>[HttpPost]public async Task<string> IsBucketExit(string bucketName){return await MyBucket.IsExist(bucketName) ?  $"{bucketName}桶已存在" : $"{bucketName}桶不存在";}/// <summary>/// 2、 创建bucket/// </summary>/// <param name="bucketName">bucket 名称</param>/// <returns></returns>[HttpPost]public async Task<string> CreateBucket(string bucketName){return await MyBucket.Create(bucketName);}/// <summary>/// 3、移除bucket/// </summary>/// <param name="bucketName">bucket 名称</param>/// <returns></returns>[HttpDelete]public async Task<string> DeleteBucket(string bucketName){return await MyBucket.Delete(bucketName);}/// <summary>/// 4、获取bucket列表/// </summary>/// <returns></returns>[HttpGet]public async Task<ListAllMyBucketsResult?> GetBucketList(){return await MyBucket.GetList();}}
}

3、实现效果

启动项目,使用Swagger进行接口测试;

注意:

  • 需要确保,项目中已经配置了Swagger;
  • 需要确保,MinIO服务已经启动;

项目启动后的swagger页面:

.net 项目中配置 Swagger-CSDN博客 

可参考上方链接配置swagger;

先在MinIO控制台中创建一个名为zyl的bucket;

(1)判断bucket是否存在

输入桶名,点击测试;

 执行后可以看到数据正常返回;

(2)新建bucket

(3)删除bucket

(4)获取bucket列表

四、管理文件

1、MyObject类

在【Managers】文件夹中新建【MyObject】类,用来管理存储桶中的文件对象;

【Managers/MyObject.cs】

using Minio.DataModel.Args;
using Minio;
using Zyl_MinIO_Demo.Helper;
using Minio.Exceptions;namespace Zyl_MinIO_Demo.Managers
{public class MyObject{private static readonly MinioClient minioClient = MinIO.CreateMinioClient();/// <summary>/// 1、下载文件 到本地/// </summary>public async static Task<String> DownloadFile(string bucketName, string objectName) {try{string folderPath = "D:\\minio-download-files\\";if (!Directory.Exists(folderPath)) {DirectoryInfo directoryInfo = new DirectoryInfo(folderPath);directoryInfo.Create();}StatObjectArgs statObjectArgs = new StatObjectArgs().WithBucket(bucketName).WithObject(objectName);await minioClient.StatObjectAsync(statObjectArgs);GetObjectArgs getObjectArgs = new GetObjectArgs().WithBucket(bucketName).WithObject(objectName).WithFile(folderPath + objectName);await minioClient.GetObjectAsync(getObjectArgs);return "Success";}catch (MinioException e){return $"Failure\r\n{e.Message}";}}/// <summary>/// 2、上传文件 指定文件/// </summary>public async static Task<string> UploadFile(string bucketName,string fileFullPath){try{// 判断bucket是否存在bool isExit = await MyBucket.IsExist(bucketName);if (!isExit){Console.Out.WriteLine($"{bucketName}桶不存在");return $"{bucketName}桶不存在,文件上传失败";}string objectName = fileFullPath.Split("\\")[^1];// 上传文件PutObjectArgs putObjectArgs = new PutObjectArgs().WithBucket(bucketName).WithObject(objectName).WithFileName(fileFullPath).WithContentType("application/octet-stream");await minioClient.PutObjectAsync(putObjectArgs).ConfigureAwait(false);return $"{objectName}上传成功";}catch (Exception e){return $"Failure\r\n{e.Message}";}}/// <summary>/// 3、删除 指定文件/// </summary>public async static Task<string> DeleteFile(string bucketName, string objectName){try{// 判断bucket是否存在bool isExit = await MyBucket.IsExist(bucketName);if (!isExit){return $"{bucketName}桶不存在,文件删除失败";}RemoveObjectArgs removeObjectArgs = new RemoveObjectArgs().WithBucket(bucketName).WithObject(objectName);await minioClient.RemoveObjectAsync(removeObjectArgs);return $"{bucketName}桶中的{objectName}文件删除成功";}catch (MinioException e){return $"Failure\r\n{e.Message}";}}/// <summary>/// 4、获取指定文件的url链接/// </summary>public async static Task<String> GetFileUrl(string bucketName, string objectName){try{PresignedGetObjectArgs args = new PresignedGetObjectArgs().WithBucket(bucketName).WithObject(objectName).WithExpiry(60 * 60 * 24 * 7);return await minioClient.PresignedGetObjectAsync(args);}catch (MinioException e){return $"Failure\r\n{e.Message}";}}}
}

(1)下载文件对象

Task GetObjectAsync(GetObjectArgs args)
  •  用来下载一个文件对象,并保存到本地;

(2)上传文件对象

Task PutObjectAsync(PutObjectArgs args)
  •  若上传的文件名于之前相同,则会覆盖;

(3)删除文件对象

Task RemoveObjectAsync(RemoveObjectArgs args)

(4)获取文件对象URL

Task<string> PresignedGetObjectAsync(PresignedGetObjectArgs args)
  • 返回的URL可用来直接下载该文件对象;
  • 返回的URL有效期为7天(默认),也可以自行设置(秒数);

2、ObjectController 

【Controllers/ObjectController.cs】

using Microsoft.AspNetCore.Mvc;
using Zyl_MinIO_Demo.Managers;namespace Zyl_MinIO_Demo.Controllers
{/// <summary>/// 管理 MinIO对象(默认zyl bucket桶)/// </summary>[Route("api/[controller]/[action]")][ApiController]public class ObjectController : ControllerBase{/// <summary>/// 1、下载 bucket中的文件/// </summary>/// <remarks>/// 会保存在 D:\\minio-download-files 文件夹内;/// 若本地D盘中没有该文件夹,则会自动创建;/// </remarks>/// <param name="objectName">文件名</param>/// <param name="bucketName">桶名,默认zyl</param>[HttpPost]public async Task<string> DownloadObject( string objectName, string bucketName = "zyl"){return await MyObject.DownloadFile(bucketName, objectName);}///<summary>/// 2、上传 本地指定文件/// </summary>/// <remarks>/// 上传同名文件,会覆盖之前的/// </remarks>/// <param name="fileFullPath">上传文件的完整绝对路径,例如:D:\test\test.txt</param>/// <param name="bucketName">桶名,默认zyl</param>[HttpPost]public async Task<string> UploadObject(string fileFullPath, string bucketName = "zyl"){return await MyObject.UploadFile(bucketName, fileFullPath);}/// <summary>/// 3、删除 指定桶中的指定文件/// </summary>/// <param name="objectName">文件名</param>/// <param name="bucketName">桶名,默认zyl</param>[HttpDelete]public async Task<string> DeleteObject(string objectName, string bucketName = "zyl"){return await MyObject.DeleteFile(bucketName, objectName);}/// <summary>/// 4、获取 指定文件的Url链接 (有效期 7天)/// </summary>/// <remarks>/// 只能是已经存在于minio中的任意文件/// </remarks>/// <param name="objectName">文件名</param>/// <param name="bucketName">桶名,默认zyl</param>/// <returns></returns>[HttpPost]public async Task<string> GetObjectUrl(string objectName, string bucketName = "zyl") {return await MyObject.GetFileUrl(bucketName, objectName);}}
}

3、实现效果

在Swagger页面,可以看到我们新增的文件对象相关接口;

(1)下载指定文件

  • 这里的默认bucket,确保在使用之前已经创建;
  • 文件会下载到本地D盘的【minio-downlo-files】文件夹中,没有该文件夹会自动创建;

(2)上传指定文件

  • 第一个参数应该填写待上传文件的完整绝对路径,这里上传的是D盘下test文件夹中的text.txt文件;
  • 上传到minio服务中的文件名取自待上传的文件名,若与之前的文件名相同,会进行覆盖;

(3)删除指定文件 

(4)获取指定文件URL 

  • 需要确保minio中已经上传了该文件;
  • 将返回的URL链接放在浏览器的地址栏,按回车即可下载查看;

 ​

======================================================================

每天进步一点点,记录一下MinIO的学习笔记;

刚开始接触后端,代码略显生涩,嘻嘻嘻;

还望走过路过的各位大佬多多指点~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/366259.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《解答元器件的排列方式》

之前刚接触电子的时候&#xff0c;心里有个疑惑&#xff0c;为什么线路板上的电子元器件是纵横交错的排列方式&#xff0c;为什么不能是像表格一样&#xff0c;一行一列&#xff0c;整整齐齐的排列&#xff1f;为什么这个芯片必须要放在线路板的中心位置呢&#xff1f;相信不少…

【面试系列】产品经理高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

深入理解 XML 和 HTML 之间的区别

在现代网络技术的世界中&#xff0c;XML&#xff08;可扩展标记语言&#xff09;和 HTML&#xff08;超文本标记语言&#xff09; 是两个非常重要的技术。尽管它们都使用标签和属性的格式来描述数据&#xff0c;但它们在形式和用途上有显著的区别。 概述 什么是 XML&#xff…

[数据集][目标检测]睡岗检测数据集VOC+YOLO格式3290张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3316 标注数量(xml文件个数)&#xff1a;3316 标注数量(txt文件个数)&#xff1a;3316 标注…

[图解]SysML和EA建模住宅安全系统-05-参数图

1 00:00:01,140 --> 00:00:03,060 这是实数没错&#xff0c;这是分钟 2 00:00:03,750 --> 00:00:07,490 但是你在这里选&#xff0c;选不了的 3 00:00:07,500 --> 00:00:09,930 因为它这里不能够有那个 4 00:00:11,990 --> 00:00:13,850 但是我们前面这里 5 00…

Linux下编程之内存检查

前言 我们在进行编程时&#xff0c;有时不免会无意中写出一些容易导致内存问题&#xff08;可能一时表象上正常&#xff09;的代码&#xff0c;导致的后果肯定是不好的&#xff0c;就像一颗颗“哑弹”&#xff0c;令人心慌。网上推荐的辅助工具很多&#xff0c;此篇文章…

爬虫逆向实战(42)-某巢登陆(AES、MD5、RSA、滑块验证码)

一、数据接口分析 主页地址&#xff1a;某巢 1、抓包 通过抓包可以发现在登录时&#xff0c;网站首先请求captcha/querySlideImage/来获取滑块验证码的图片&#xff0c;然后请求captcha/checkCode/接口来验证滑块验证码。滑块验证码校验成功后&#xff0c;请求noshiro/getPu…

每天五分钟深度学习:解决for循环效率慢的关键在于向量化

本文重点 上一节课程中,我们学习了多样本的线性回归模型,但是我们的伪代码实现中使用了大量的for循环,这样代码的问题是效率很低。为了克服这一瓶颈,向量化技术应运而生,成为提升程序执行效率、加速数据处理速度的重要手段。 向量化技术概述 向量化(Vectorization)是…

基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务1:运行环境说明

任务描述 项目的运行环境是基于Hadoop的全分布式模式集群。 任务的主要内容是规划集群节点及网络使用&#xff0c;准备初始环境&#xff0c;关闭防火墙和Selinux。 任务指导 1. 基于Hadoop的全分布式模式集群&#xff0c;如下图所示&#xff1b; 2. 硬软件环境&#xff1a;…

液压件工厂的MES解决方案:智能生产,高效未来

一、引言 虽然我国液压件行业发展迅速&#xff0c;但是大多数液压件生产企业规模小、自主创新能力不足&#xff0c;大部分液压产品处于价值链中低端。且由于技术、工艺、设备及管理等多方面的限制&#xff0c;高端液压件产品研发生产水平不足&#xff0c;无法形成有效的供给&a…

Fluent在Linux环境导入文本文件报错解决

问题描述 同样的文本文件&#xff08;如Profile文件、Chemkin反应机理文件等&#xff09;&#xff0c;Fluent在Windows环境中可正常读取和运算&#xff0c;但是在Linux环境中导入会出错。 Linux中&#xff0c;Fluent读取Chemkin文件报错 问题原因 可能原因之一&#xff1a;换…

生产环境 CentOS 7 k8s v1.28.0离线部署

背景描述&#xff1a;CentOS 7 Kubernetes 离线部署 随着云计算和微服务架构的普及&#xff0c;Kubernetes&#xff08;K8s&#xff09;已经成为容器编排的标准工具。它能够自动化应用的部署、扩展和管理&#xff0c;使得开发和运维的工作更加高效和可靠。然而&#xff0c;在一…

全自动封箱机:如何助力企业实现智能化升级

在飞速发展的工业自动化时代&#xff0c;全自动封箱机以其高效、精准、稳定的特点&#xff0c;成为了生产线上的不可或缺的一员。它不仅大大地提高了生产效率&#xff0c;降低了人工成本&#xff0c;更在产品质量控制、安全性等方面发挥了重要作用。星派将深入探讨全自动封箱机…

SAP PP学习笔记24 - 生产订单(制造指图)的创建

上面两章讲了生产订单的元素。 SAP PP学习笔记22 - 生产订单&#xff08;制造指图&#xff09;的元素1-CSDN博客 SAP PP学习笔记23 - 生产订单&#xff08;制造指图&#xff09;的元素2 - 决济规则(结算规则)-CSDN博客 这一章讲生产订单的创建。比如 - 生产订单的流程&#…

JavaScript中的事件代理(Event Delegation)

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介JavaScript中的事件代理&#xff08;Event Delegation&#xff09;1. 引言2. 事件代理的概念2.1 概述2.2 事件冒泡 3. 事件代理的工作原理3.1 绑定事件处理程序3.2 检查事件目标 4. 事件代理的实现4.1 基本示例4.2 动态添加元素 5.…

易编橙·终身成长社群:帮助编程小伙伴少走弯路

&#x1f34a; 目录 &#x1f34a; 自我介绍 &#x1f34a; 如何加入&#xff1f; &#x1f34a; 【擅长的技术】 &#x1f34a; 星主介绍 &#x1f34a; 星球天团 &#x1f34a; 易编橙终身成长社群介绍及权益&#xff5e; &#x1f34a; 受众群体 &#x1f34a; 如何…

Chapter 8 Feedback

Chapter 8 Feedback 这一章我们介绍feedback 反馈运放的原理. 负反馈是模拟电路强有力的工具. 8.1 General Considerations 反馈系统如下图所示 Aolamp open-loop gain即开环增益. Aolxo/xi β \beta β 是 feedback factor, 注意方向. β x f x o \beta\frac{x_{f}}{x_{o…

C++视觉开发 三.缺陷检测

一.距离变换 1.概念和功能 距离变换是一种图像处理技术&#xff0c;用于计算图像中每个像素到最近的零像素&#xff08;背景像素&#xff09;的距离。它常用于图像分割、形态学操作和形状分析等领域。它计算图像中每个像素到最近的零像素&#xff08;背景像素&#xff09;的距…

Hadoop权威指南-读书笔记-01-初识Hadoop

Hadoop权威指南-读书笔记 记录一下读这本书的时候觉得有意思或者重要的点~ 第一章—初识Hadoop Tips&#xff1a; 这个引例很有哲理嘻嘻&#x1f604;&#xff0c;道出了分布式的灵魂。 1.1 数据&#xff01;数据&#xff01; 这一小节主要介绍了进入大数据时代&#xff0c;面…

喜讯|华院计算认知智能引擎算法平台荣登BPAA大赛创新组TOP50

6月25日&#xff0c;备受瞩目的BPAA第四届全球应用算法模型典范大赛&#xff08;以下简称“BPAA大赛”&#xff09;正式揭晓了《第四届全球应用算法模型典范大赛创业组TOP50榜单》和《第四届全球应用算法模型典范大赛创新组TOP50榜单》。其中&#xff0c;华院计算技术&#xff…