搭建本地 Mino WebApi

前言:在实现一个文档管理模块时,前端使用的是Ant Design Blazor框架,使用Upload组件上传文件时,它有个Action属性(具体如下),点击图片上传就会去请求这个接口,完成图片上传到服务器,如果想要不使用Action通过api接口直接上传,官方推荐使用原生的InputFile,我一想,怎么写着写着还倒退了,我个人非常不喜欢,我觉得新出来的东西肯定比老的要好,尤其是在ui这块,于是否决了使用InputFile的方法。

但是我目前所做的项目是一个blazor server项目,他的项目结构主要有两个应用程序,一个是Web,还有个是WebApi,Web下面是前端和后端服务,WebApi下面则是api接口,这是供后面移动端调用的。那在此项目中,最好的办法是将上传接口写在WebApi里面,然后启动的时候需要同时启动两个,这样前端点击上传的时候就可以直接访问WebApi提供的上传接口。但是这个方法有个缺点,就是为了一个Api启动整个WebApi项目,有点高射炮打蚊子的感觉。

想到上传文件这个功能,不仅在当前项目中需要用到,公司的其他三个项目也要用到,那为什么不使用minio搭建一个WebApi呢?这个WebApi来负责上传、下载功能,其他系统只需要调用Api即可,也不需要去每个系统中集成Minio了,那不是轻松很多?更加高效。

js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<Upload @ref="upload"
Action="/api/document/upload"
showUploadList="false"
Drag
OnChange="OnUploadChange"
Accept=".pdf,.doc,.docx,.xls,.xlsx,.jpg,.png"
OnSingleCompleted="OnSingleCompleted"
OnBeforeUpload="OnBeforeUpload"
Disabled="uploading">
<p class="ant-upload-drag-icon">
<Icon Type="@IconType.Outline.Inbox" />
</p>
<p class="ant-upload-text">单击或拖动文件到此区域进行上传</p>
<p class="ant-upload-hint">
Support for a single or bulk upload. Strictly prohibit from uploading company data or other
band files
</p>
</Upload>

说干就干,开始以minio搭建一个WebApi项目。

一、项目功能

  • 支持文件上传与下载,自动按文件类型、日期归档存储。
  • 自动配置MinIO凭证、密钥、桶信息。
  • 桶不存在时自动创建。
  • 支持常见文件类型(Excel、Word、PNG、JPG、PDF)分文件夹管理。
  • 上传同名文件时,系统自动为文件名添加唯一后缀(如时间戳+短guid),避免覆盖,便于溯源。

二、技术栈/依赖库

  • .NET 8 WebAPI
  • MinIO .NET SDK
  • ASP.NET Core 配置系统
  • 依赖注入与中间件

三、详细需求

  1. 配置自动化
    • 通过appsettings.json配置MinIO服务地址、AccessKey、SecretKey、默认桶名。
  2. 桶管理
    • 程序启动时检测桶是否存在,不存在则自动创建。
  3. 文件归档存储
    • 归档结构为:
      • 一级目录:桶名称(bucket)
      • 二级目录:文件类型(如excel、word、png、jpg、pdf,需标准化小写)
      • 三级目录:日期(yyyyMMdd)
      • 四级目录:具体文件
    • 示例路径:bucket/excel/20240601/xxx.xlsx
    • 桶数量建议控制在合理范围,文件类型需统一标准。
  4. 上传接口
    • 支持多种文件类型上传,自动归档。
    • 返回文件访问路径或下载链接。
  5. 下载接口
    • 支持按路径下载指定文件。
  6. 安全与签名校验
    • 上传和下载接口必须支持HMAC-SHA256签名校验,防止接口被伪造、重放。
    • 客户端需在请求Header中携带:
      • X-Api-Key:API密钥标识
      • X-Timestamp:当前Unix时间戳(秒)
      • X-Signature:签名值
    • 签名内容格式:X-Api-Key + X-Timestamp + 文件内容,用配置的api-key做HMAC-SHA256生成签名。
    • 服务端需校验:
      • Header参数完整性
      • 时间戳有效性(如5分钟内)
      • 签名正确性
    • api-key需通过配置文件安全管理,建议定期更换。
    • 签名算法、Header约定、异常响应需在接口文档中明确说明。

四、应用场景

  • 企业内部文档管理、归档。
  • 业务系统文件上传、下载统一存储。
  • 支持多服务器/本地MinIO部署,便于开发、测试、生产环境切换。

项目已开源

项目地址