当前位置: 首页 > news >正文

ASP.NET Core上传文件到minio

1.用到的依赖包—Minio

使用命令添加依赖,或者使用Nugui搜索minio依赖后添加到指定项目中

dotnet add package Minio --version 6.0.5

我这里是使用了JetBrains Rider,这工具其实也挺好使的,尤其对于我本身写java的人来说,很容易习惯,无非就是占用内存比起vs code要高不少。

如果是用vs code,需要先安装nug包管理插件——NuGet Package Manager GUI

使用command+shift+p(macOS)或者ctrl+shift+p(Windows),输入nug,然后搜索即可

2.相关代码

    [HttpPost("upload/single")][ProducesResponseType(typeof(CommonResult<FileUploadResp>), StatusCodes.Status200OK)][ProducesResponseType(StatusCodes.Status200OK)]public async Task<IActionResult> PostUploadFileMinio(string? bucket, IFormFile file){if (file is not { Length: > 0 }){return Ok(CommonResult<string>.Failed(500, "文件不能为空"));}_service._logger.LogDebug("上传的文件信息==={file}", JsonHelper.Serialize(file));var response = await _service.UploadFile(bucket, file);return Ok(CommonResult<FileUploadResp>.Success("上传成功", response));}
public async Task<FileUploadResp> UploadFile(string? bucket, IFormFile file){bucket ??= "test";try{var safeFileName = Path.GetFileName(file.FileName);safeFileName = GenerateUniqueFileName(safeFileName);await using var stream = file.OpenReadStream();await _minioClient.PutObjectAsync(new PutObjectArgs().WithBucket(bucket).WithObject(safeFileName).WithStreamData(stream).WithObjectSize(file.Length).WithContentType(file.ContentType));var endpoint = _minioClient.Config.Endpoint;if (!Uri.TryCreate(endpoint, UriKind.Absolute, out var uri)){_logger.LogError("minio的endpoint无效==={uri}", uri);throw new ArgumentException("minio端点无效");}var fileUrl = $"{endpoint}/{bucket}/{safeFileName}";var resp = new FileUploadResp(safeFileName, fileUrl);_logger.LogDebug("文件上传成功==={resp}", JsonHelper.Serialize(resp));return resp;}catch (Exception ex){_logger.LogError(ex, "minio文件上传异常");throw new Model.CusException.MinioException(500, "文件上传失败,稍后重试");}}

3.上传测试

在swagger中调用上传接口

控制台日志

浏览器访问minio图片

http://www.dtcms.com/a/362769.html

相关文章:

  • 嵌入式硬件 - 51单片机1
  • JVM中产生OOM(内存溢出)的8种典型情况及解决方案
  • 自从不小心踢了一脚主机之后,电脑频繁蓝屏、死机、无法开机……
  • 鸿蒙Next开发指南:XComponent与Progress组件的深度解析与实践
  • 睿思芯科正式加入龙蜥社区,携手共建 RISC-V 服务器生态新标杆
  • react+taro的使用整理
  • 【JavaEE】(21)Spring AOP
  • 解密GTH时钟架构:一网打尽收发器时钟之谜
  • 火语言 RPA 界面应用生成:低代码逻辑下的功能设计与场景适配
  • PowerPoint和WPS演示如何循环放映PPT
  • 想找Gamma的平替?这几款AI PPT工具值得试试
  • 从技术架构到经济价值:低代码在企业开发中的成本节约潜力
  • LeetCode 925.长按键入
  • 哈希表-面试题01.02.判定是否互为字符重排-力扣(LeetCode)
  • 趣味学RUST基础篇(HashMap)
  • 二叉树的非递归遍历 | 秋招面试必备
  • Spring Bean
  • LLM面试50问:NLP/RAG/部署/对齐/安全/多模态全覆盖
  • R语言根据经纬度获得对应样本的省份
  • WPF依赖属性和依赖属性的包装器:
  • iOS混淆工具实战 视频流媒体类 App 的版权与播放安全保护
  • 安卓学习 之 gradle下载失败的解决方法
  • Elasticsearch面试精讲 Day 5:倒排索引原理与实现
  • 跨越产业技术障碍、创新制造模式的智慧工业开源了
  • 【开题答辩全过程】以宠物生活社区为例,包含答辩的问题和答案
  • 扩散模型驱动的智能设计与制造:下一场工业革命?
  • 最新!阿里财报电话会蒋凡与吴泳铭透露重要信息:淘宝闪购成绩斐然;零售与AI双轮驱动;阿里云推出“Agent Bay”新产品···
  • 物联网为何离不开天硕工业级SSD固态硬盘?
  • maven 常用指令
  • Corona渲染噪点终结指南:3ds Max高效去噪全攻略