MinIO 使用完整教程(Windows部署 + WinSW开机自启 + .NET8集成)

MinIO 使用完整教程(Windows部署 + WinSW开机自启 + .NET8集成)

官网:https://www.minio.org.cn/

一、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、应用场景

  1. 云存储服务:可以作为独立的云存储解决方案,为企业或个人提供文件存储、备份和共享服务。用户可以通过 Web 界面、命令行工具或 API 来访问和管理存储在 Minio 中的文件。
  2. 大数据存储:适合存储海量的非结构化数据,如日志文件、传感器数据、社交媒体数据等。这些数据可以通过大数据分析工具进行处理和分析,而 Minio 作为存储后端提供可靠的数据存储服务。
  3. 容器存储:在容器化环境中,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类型,否则浏览器只会下载不会预览。

posted @ 2026-10-30 13:53  摩诘  阅读(14)  评论(0)    收藏  举报