MinIO (二) .net core中实现上传下载

这篇文章里,我们介绍在.net core webapi项目中操作MinIO。

首先要创建一个桶,命名为demo

英文文档看不太顺畅,在网上找了一个api中文文档,可供参考

.NET Client API参考文档 - MinIO 帮助文档 - 开发文档 - 文江博客

创建桶

点击Buckets→Create Bucket创建桶

桶名可以命名为demo,点击确认

创建用户和秘钥

创建用户

创建AccessKey和SecretKey,点击Identity→Users→点击上一步创建的用户

把上面的AccessKey和SecretKey的值保存下来,可以在配置文件中使用。

创建WebApi项目

创建个webapi项目,并添加Minio的NuGet包,这里我选3.1.13版本

将Minio注入进来,并将minio连接信息配置在appsetting,json文件中Startup.cs

public void ConfigureServices(IServiceCollection services)
{services.AddHttpClient();#region minio客户端注入var minioClient = new MinioClient(Configuration["MinIO:Endpoint"], Configuration["MinIO:AccessKey"], Configuration["MinIO:SecretKey"]);services.AddSingleton(minioClient);#endregion#region 带权限的swaggerservices.AddSwaggerGen(options =>{//定义api文档options.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "My API", Version = "v1" });//包含vs生成的注释文档//var xmlPath = Path.Combine(webHostEnvironment.ContentRootPath, Assembly.GetExecutingAssembly().GetName().Name + ".xml");//if (File.Exists(xmlPath))//{//    options.IncludeXmlComments(xmlPath, true);//}//描述安全信息options.AddSecurityDefinition(CookieAuthenticationDefaults.AuthenticationScheme, new OpenApiSecurityScheme(){Name = CookieAuthenticationDefaults.AuthenticationScheme,Scheme = CookieAuthenticationDefaults.AuthenticationScheme});});#endregionservices.AddControllers();#region 不带权限的swagger//services.AddSwaggerGen(c =>//{//    c.SwaggerDoc("v1", new OpenApiInfo { Title = "MinioDemo.WebApi", Version = "v1" });//});#endregionservices.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();services.AddAuthorization();}

appsetting,json

"AccessKey"和"SecretKey"可以用账号密码,也可以用配置中,新加用户中的配置信息

{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*",//minIO配置"MinIO": {//服务器IP"Endpoint": "localhost:9090",//账号"AccessKey": "minioadmin",//密码"SecretKey": "minioadmin",//默认存储桶"Bucket": "demo",//保存文件的根目录"BucketDirectory": "D:\\aaa\\bbb\\ccc"},"Kestrel": {"EndPoints": {"Http": {"Url": "http://*:5000"}}},"PDM": {"Secret": "","Uri": ""}
}

完整上传、下载代码

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System;
using Minio;
using System.Linq;
using Minio.Exceptions;
using Microsoft.AspNetCore.Authorization;
using Minio.DataModel;
using System.Reactive.Linq;
using System.Data;
using System.Reactive.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using Newtonsoft.Json;namespace MinIOTest.Controllers
{[ApiController][Route("api/[controller]/[action]")]//[Authorize]public class MinIOController : ControllerBase{string _bucketName = string.Empty;//默认桶private readonly MinioClient _client;private readonly IConfiguration _configuration;public MinIOController(MinioClient client,IConfiguration configuration){_client = client;_configuration = configuration;_bucketName = configuration["MinIO:Bucket"];}#region 测试[HttpGet]public async Task<dynamic> test(){return new { bb = "bbb", cc = "ccc" };}#endregion#region 上传文件/// <summary>/// 上传文件/// </summary>/// <param name="filePath">文件保存路径</param>/// <param name="files">文件</param>/// <returns></returns>[HttpPost][AllowAnonymous]public async Task<dynamic> UploadFile(string filePath, List<IFormFile> files){long size = files.Sum(f => f.Length);try{bool isExists = await _client.BucketExistsAsync(_bucketName);//桶是否存在//如果桶不存在则创建桶if (!isExists){await _client.MakeBucketAsync(_bucketName);}foreach (var formFile in files){string saveFileName = $"{Path.GetFileName(formFile.FileName)}";//存储        的文件名string objectName = $"/{filePath}/{saveFileName}";//文件保存路径if (formFile.Length > 0){Stream stream = formFile.OpenReadStream();await _client.PutObjectAsync(_bucketName,objectName,stream,formFile.Length,formFile.ContentType);}}}catch (MinioException ex){_logger.LogError($"文件上传错误:{ex}");return Ok(new { Success = false, Message = $"文件上传错误:{ex.Message}"                                         });}return Ok(new { Success = true, Count = files.Count, Size = size });}#endregion 上传文件#region 下载文件/// <summary>/// 下载文件/// </summary>/// <param name="fileName">文件地址</param>/// <returns></returns>[HttpGet][AllowAnonymous]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 ex){_logger.LogError($"下载附件发生错误:{ex}");return Ok(new { Success = false, Message = $"下载附件发生错误:{ex.Message}" });}return File(memoryStream, GetContentType(fileName));}#endregion 下载文件#region 获取文件ContentType类型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 if (fileName.Contains(".docx")){return "application/msword";}else if (fileName.Contains(".txt")){return "text/plain";}else{return "application/octet-stream";}}#endregion 获取文件类型#region 获取指定文件目录/// <summary>/// 获取指定文件目录/// </summary>/// <param name="prefixArr">文件路径(格式:["工程图纸/001","工程图纸/002"])        </param>/// <param name="fileName">文件名,模糊查询</param>/// <returns></returns>[HttpPost]public async Task<object> GetFileListAsycn(string[] prefixArr, string fileName){try{bool found = await _client.BucketExistsAsync(_bucketName);if (found){List<Item> filePathList = new List<Item>();foreach (string prefix in prefixArr){var files = _client.ListObjectsAsync(_bucketName, prefix, true);var filePaths = files.ToList().Wait();filePathList.InsertRange(filePathList.Count(), filePaths);}if (!string.IsNullOrEmpty(fileName)){filePathList = filePathList.Where(d =>         d.Key.Split('/').Last().Contains(fileName)).ToList();}return Ok(new { Success = true, Count = filePathList.Count(), Data = filePathList });}else{return Ok(new { Success = false, Data = $"桶[{_bucketName}]不存在" });}}catch (MinioException ex){_logger.LogError($"MinIO发生错误:{ex}");return Ok(new { Success = false, Data = $"MinIO发生错误:{ex.Message}" });}}#endregion 获取指定文件目录#region 获取最上层目录/// <summary>/// 获取最上层目录/// </summary>/// <returns></returns>[HttpGet]public async Task<object> GetDirectoryAsycn(){try{bool found = await _client.BucketExistsAsync(_bucketName);if (found){var files = _client.ListObjectsAsync(_bucketName, "", false);var fileDirectory = files.ToList().Wait();foreach (var file in fileDirectory){file.Key = file.Key.Replace("/", "");}return Ok(new { Success = true, Data = fileDirectory });}else{return Ok(new { Success = false, Data = $"桶[{_bucketName}]不存在" });}}catch (MinioException ex){_logger.LogError($"MinIO发生错误:{ex}");return Ok(new { Success = false, Data = $"MinIO发生错误:{ex}" });}}#endregion 获取最上层目录  }
}

运行程序,如下图,上传接口

下载接口,输入文件地址

获取某个文件夹下的所有文件目录,递归获取

获取文件列表接口这里要要注意下,因为ListObjectsAsync这个接口是异步的,当自己写的接口执行完的时候,调用MinIO获取文件列表的接口还没执行完,所以,获取MinIO文件列表接口(ListObjectsAsync),要使用方法Wait()改成同步,即

var files = _client.ListObjectsAsync(_bucketName, prefix, true);
var filePaths = files.ToList().Wait();

这样,才能获取全部路径

获取根目录,非递归

其他api接口方法,查看官方文档,文档地址

Windows 的 MinIO 对象存储 — MinIO Object Storage for Windows

.NET Client API参考文档 - MinIO 帮助文档 - 开发文档 - 文江博客

上一篇:MinIO (一)安装并生成windows服务

下一篇:MinIO (三) 使用Webhook实时同步文件

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

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

相关文章

Java 操作 Excel:生成数据、设置单元格样式、设置数据有效性(hutool)

必读信息 该篇文章&#xff0c;主要通过 Java 代码对 Excel 文件的常用操作&#xff0c;包括&#xff1a;生成表格、修改单元格样式、设置数据有效性。 该篇文章&#xff0c;在官网文献下增加个人的看法和理解&#xff0c;如文中有出现不符、错误或需要补充的地方&#xff0c…

计算机算法分析与设计(13)---贪心算法(多机调度问题)

文章目录 一、问题概述1.1 思路分析1.2 实例分析 二、代码编写 一、问题概述 1.1 思路分析 1. 设有 n n n 个独立的作业 1 , 2 , … , n {1, 2, …, n} 1,2,…,n&#xff0c;由 m m m 台相同的机器 M 1 , M 2 , … , M m {M_1, M_2, …, M_m} M1​,M2​,…,Mm​ 进行加工处…

一文带你GO语言入门

什么是go语言? Go语言(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go语言的主要特点包括:- 简洁和简单 - 语法简单明快,易于学习和使用 特点 高效 编译速度快,执行效率高 并发支持 原生支持并发,利用goroutine实现高效的并发…

AP5101C 高压线性恒流 LED电源驱动IC 3D打印机显示灯驱动器

1&#xff0c;产品描述 AP5101C 是一款高压线性 LED 恒流芯片 &#xff0c; 简单 、 内置功率管 &#xff0c; 适用于6- 100V 输入的高精度降压 LED 恒流驱动芯片。电流2.0A。AP5101C 可实现内置MOS 做 2.0A,外置 MOS 可做 3.0A 的。AP5101C 内置温度保护功能 &#xff0c;温度…

【C++】多态 -- 详解

⚪前言 声明一下&#xff0c;下面的代码和解释都是在 VS2019 下的 X86 程序中进行的&#xff0c;涉及的指针都是 4 bytes。如果要其他平台下&#xff0c;部分代码需要改动。比如&#xff1a;如果是 X64 程序&#xff0c;则需要考虑指针是 8 bytes 问题等等。其它编译环境下&…

汽车屏类产品(二):360全景环视(SVC)、多分割显示、行车记录

前言 随着新能源汽车的快速发展,带动了车载器件的大发展,大的比如域控,小的创新更是不断涌现。而车载显示屏可以说是一大类产品,产品形态也是愈发多样化,比如:仪表cluster、中控IVI、副驾屏、行车记录仪、流媒体后视镜、透明A柱屏、方向盘屏(替代方向盘按键)、门饰板显…

15 | JPA 对 Web MVC 开发者做了哪些支持

我们使用 Spring Data JPA 的时候&#xff0c;一般都会用到 Spring MVC&#xff0c;Spring Data 对 Spring MVC 做了很好的支持&#xff0c;体现在以下几个方面&#xff1a; 支持在 Controller 层直接返回实体&#xff0c;而不使用其显式的调用方法&#xff1b;对 MVC 层支持标…

vant_ CountDown倒计时

语法可以直接在官网查看 需求 后端返回的数据格式如下 [{"id": 1,"btn_text": "1","second": 0},{"id": 2,"btn_text": "1","second": 0}... ]之前约定second最多30s&#xff0c; 因此只需…

一文学会使用WebRTC API

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一项开放标准和技术集合&#xff0c;由 W3C 和 IETF 等组织共同推动和维护&#xff0c;旨在通过Web浏览器实现实时通信和媒体流传输。WebRTC于2011年6月1日开源并在Google、Mozilla、Opera支持下被纳入万维网联盟的…

ELK日志分析系统的详细介绍与部署

文章目录 1. ELK的概述1.1 简介1.2 使用ELK的理由1.3 ELK的主要组件1.3.1 Elasticsearch1.3.2 Kibana1.3.3 Logstash1.3.3.1 简介1.3.3.2 Logstash常用相关命令选项 1.3.3.3 Logstash 的输入和输出流1.3.4 Logstash的相关配置文件 1.3.4 Filebeat1.3.4.1 简介1.3.4.2 filebeat …

华为Atlas 200I DK A2开发者套件--基础使用配置

文章目录 前言一、快速开始二、通过路由器联网三、USB相机总结 前言 Atlas 200I DK A2基础使用配置方法。准备好键鼠、显示器、网线、USB拓展器。 一、快速开始 下载最新官方Windows版本昇腾开发者套件一键制卡工具&#xff1a; https://ascend-repo.obs.cn-east-2.myhuaweic…

VBA技术资料MF71:查找所有空格并替换为固定字符

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

基于鹰栖息优化的BP神经网络(分类应用) - 附代码

基于鹰栖息优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于鹰栖息优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.鹰栖息优化BP神经网络3.1 BP神经网络参数设置3.2 鹰栖息算法应用 4.测试结果&#x…

Linux高性能服务器编程 学习笔记 第十六章 服务器调制、调试和测试

Linux平台的一个优秀特性是内核微调&#xff0c;即我们可以通过修改文件的方式来调整内核参数。 服务器开发过程中&#xff0c;可能会碰到意想不到的错误&#xff0c;一种调试方法是用tcpdump抓包&#xff0c;但这种方法主要用于分析程序的输入和输出&#xff0c;对于服务器的…

23基于MATLAB的小波降噪,默认阈值消噪,强制消噪,给定软阈值消噪方法,数据直接替换后就可以跑。

基于MATLAB的小波降噪&#xff0c;默认阈值消噪&#xff0c;强制消噪&#xff0c;给定软阈值消噪方法&#xff0c;数据直接替换后就可以跑。 https://www.xiaohongshu.com/explore/652d57c600000

10.Linear Map transformation rules

线性映射 从一个基底到另一个基底 所遵循的转换规则。 假设&#xff1a; 由一个矩阵给出的线性映射在这&#xff0c;并且是在基底e上表示&#xff0c; 该线性映射将e1变成0.5个e1&#xff0c;将e2变成2个e2&#xff1b; 假设有个向量V&#xff0c;其分量是【1&#xff0c;1…

从零开始学习秒杀项目

构思了很多种讲述这个简易版的秒杀项目的思路&#xff0c;比如按照功能分类&#xff0c;按照项目亮点串起来讲述&#xff0c;总觉得不适合基础薄弱的同学来学习&#xff0c;所以本项目按照从搭建开始&#xff0c;过程中需要什么来学习什么。 技术栈 SpringBootmybatisPlus&am…

从零开始的stable diffusion

stable diffusion真的是横空出世&#xff0c;开启了AIGC的元年。不知你是否有和我一样的困惑&#xff0c;这AI工具好像并不是那么听话&#xff1f; 前言 我们该如何才能用好stable diffusion这个工具呢&#xff1f;AI究竟在stable diffusion中承担了什么样的角色&#xff1f;如…

【EI会议征稿】2024年第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)

2024年第四届人工智能、自动化与高性能计算国际会议&#xff08;AIAHPC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Automation and High Performance Computing 2024第四届人工智能、自动化与高性能计算国际会议(AIAHPC 2024)将于202…

文心一言 4.0 ERNIE-Bot 4.0 :ERNIE-Bot 4.0 大模型深度测试体验报告

本心、输入输出、结果 文章目录 文心一言 4.0 ERNIE-Bot 4.0 &#xff1a;ERNIE-Bot 4.0 大模型深度测试体验报告前言相关跳转文心一言 4.0 ERNIE-Bot 4.0 接口简介Bash 请求示例代码Windows 模式使用 Python 请求如果直接使用官方提供的代码文心一言 4.0 ERNIE-Bot 4.0 API 在…