MinIO 使用完整教程(Windows部署 + WinSW开机自启 + .NET8集成)
MinIO 使用完整教程(Windows部署 + WinSW开机自启 + .NET8集成)
一、MinIO介绍
Minio 是一个高性能、分布式的对象存储系统。
1、基本概念
对象存储:与传统的文件存储和块存储不同,对象存储将数据作为对象进行管理。每个对象包含数据本身、元数据(如对象的大小、创建时间、类型等信息)和一个全局唯一的标识符。在 Minio 中,这些对象存储在存储桶(buckets)中,就像文件存储在文件夹中一样。
存储桶(Buckets):是用于存储对象的容器,类似于文件系统中的文件夹。存储桶有自己的命名规则,并且在一个 Minio 服务器中,存储桶的名字是全局唯一的。例如,你可以创建名为 "photos"、"documents" 等不同用途的存储桶来分类存储对象。
2、功能特性
兼容性
Minio 与亚马逊 S3(Simple Storage Service)的 API 高度兼容。这意味着如果你的应用程序是基于 S3 开发的,那么在大多数情况下可以很容易地迁移到 Minio 上,只需修改访问端点和密钥等少量配置,而不用对代码进行大规模的重写。
可扩展性
它支持分布式存储,能够通过添加多个节点(服务器)来扩展存储容量和性能。这种分布式架构使得 Minio 可以存储海量的数据,并且能够应对高并发的访问请求。例如,在处理大量的图片、视频或日志文件存储时,Minio 可以随着数据量的增长而灵活扩展。
数据安全
Minio 提供了多种数据安全机制。它支持数据加密,无论是在存储时还是在传输过程中,都可以对数据进行加密保护,防止数据泄露。同时,Minio 还支持访问控制策略,你可以设置不同用户或用户组对存储桶和对象的访问权限,如只读、读写、完全控制等权限,以确保数据的安全性和合规性。
高性能
Minio 在设计上注重性能优化。它采用了高效的存储引擎和数据访问协议,能够快速地存储和检索对象。在处理大量小文件或大文件的读写操作时,都能够保持较高的性能。例如,在云存储场景下,当用户需要快速上传或下载图片、文档等文件时,Minio 可以提供快速的响应。
3、应用场景
- 云存储服务:可以作为独立的云存储解决方案,为企业或个人提供文件存储、备份和共享服务。用户可以通过 Web 界面、命令行工具或 API 来访问和管理存储在 Minio 中的文件。
- 大数据存储:适合存储海量的非结构化数据,如日志文件、传感器数据、社交媒体数据等。这些数据可以通过大数据分析工具进行处理和分析,而 Minio 作为存储后端提供可靠的数据存储服务。
- 容器存储:在容器化环境中,Minio 可以作为存储卷(volume)为容器提供持久化存储。例如,在 Kubernetes 集群中,应用容器可以使用 Minio 存储桶来存储和访问数据,方便应用的部署和管理。
二、MinIO Windows部署
下载地址:https://www.minio.org.cn/download.shtml#/windows
1、创建minio文件夹;
2、创建内部文件夹bin、data、log文件夹,拷贝minio.exe到bin文件夹,拷贝bat文件到bin文件夹修改内部路径;
3、双击bat文件启动;
4、修改业务系统配置指向MinIO存储图片地址。
启动bat脚本 run.bat
@echo off
:: 设置用户名和密码
set MINIO_ACCESS_KEY=admin
set MINIO_SECRET_KEY=123456
:: 启动minio服务,9000:控制台端口,9005:api端口
minio.exe server E:\minio\data --console-address :9000 --address :9005
pause
自定义端口示例:
set MINIO_ACCESS_KEY=admin
set MINIO_SECRET_KEY=123456
minio.exe server --address :9999 D:\minioData
三、MinIO设置Windows开机自启动(WinSW)
借助Windows Service Wrapper工具把MinIO注册成系统服务,实现开机后台自动运行。
1、下载winsw工具:http://repo.jenkins-ci.org/releases/com/sun/winsw/winsw/1.18/winsw-1.18-bin.exe
2、把 winsw‑1.18‑bin.exe 改名为 minio‑service.exe,放置到minio的bin目录。
3、在bin目录新建 minio‑service.xml
<service>
<id>minio</id>
<name>minio</name>
<description>minio对象存储服务。</description>
<logpath>E:\minio\log</logpath>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
<executable>E:\minio\bin\minio.bat</executable>
</service>
4、管理员身份打开CMD,进入bin目录执行命令
::安装服务
minio-service.exe install
::卸载服务
minio-service.exe uninstall
5、重启电脑测试是否开机自动启动。
注意:xml里面的路径要和你本机实际磁盘路径保持一致。
四、.NET 8 集成 MinIO文件存储服务
实现bucket管理,文件上传等基础操作;重点说明图片上传可预览/不可预览问题。
关键点:ContentType MIME类型决定浏览器是下载还是预览图片。
application/octet‑stream:通用二进制流,浏览器直接触发下载,不能预览图片image/jpeg/image/png:图片MIME类型,浏览器可以直接预览图片
a、上传后图片不能预览的示例代码
硬编码ContentType为application/octet‑stream,图片访问直接下载,无法浏览器预览。
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}";
}
}
b、上传后图片可以浏览器预览示例代码
使用IFormFile自带的ContentType,保留图片原始MIME类型,浏览器可以直接预览图片。
public async Task<(bool, string)> UploadFile(string bucketName, string fileFullPath, IFormFile formFile)
{
try
{
if (formFile.Length > 0)
{
Stream stream = formFile.OpenReadStream();
await _minioClient.PutObjectAsync(new PutObjectArgs()
.WithBucket(bucketName)
.WithObject(fileFullPath)
.WithStreamData(stream)
.WithContentType(formFile.ContentType)
.WithObjectSize(formFile.Length));
return (true, $"{fileFullPath}");
}
else
{
return (false, $"{fileFullPath}上传失败");
}
}
catch (Exception e)
{
return (false, $"Failure\r\n{e.Message}");
}
}
补充说明
1、Bucket管理包含:判断桶是否存在、创建桶、删除桶;
2、文件权限策略:可以MinIO控制台手动配置Bucket策略,也可以代码调用API设置策略;
3、上传图片能否预览,核心在于ContentType参数,不要全部硬编码为二进制流类型。
踩坑小结
1、WinSW注册Windows服务必须管理员权限执行CMD;
2、所有磁盘路径不要带中文、空格;
3、对外访问图片,需要配置Bucket的读写策略,否则会403无权限;
4、.NET上传图片务必传递正确MIME类型,否则浏览器只会下载不会预览。

浙公网安备 33010602011771号