MinIO使用
Minio安装运行:
一、拉取MinIO镜像#
docker pull minio/minio
二、创建挂载目录#
1 宿主机与容器挂载映射
宿主机位置 容器位置
/data/minio/config /data
/data/minio/data /root/.minio
2 挂载命令执行
mkdir -p /data/minio/config
mkdir -p /data/minio/data
三、运行MinIO#
docker run -p 9000:9000 -p 9090:9090 --name minio
-d --restart=always
-e "MINIO_ACCESS_KEY=admin"
-e "MINIO_SECRET_KEY=admin123456"
-v /data/minio/data:/data
-v /data/minio/config:/root/.minio \minio/minio
server /data --console-address ":9090"
命令参数解释:#
-d :后台启动
-p :端口映射
-name :为这个容器取一个名字
-e :设置环境变量
-v :文件挂载位置
–console-address “:9090” :选择静态端口号,这里注意下控制台端口号不能和静态端口号一样
四、查看MinIO是否启动成功#
打开 http://ip:9090
密码为上面设置的admin admin123456
DotnetCore简单调用MInIO
准备#
这里我们要先创建个桶(Bucket),命名为test
.NET Core集成#
这里都是围绕这minio官方提供的.net SDK进行扩展使用,更多详情可以参考官网http://docs.minio.org.cn/docs/master/dotnet-client-quickstart-guide
创建个webapi项目,并添加Minio的NuGet包,这里我选3.1.13版本
将Minio注入进来,并将minio连接信息配置在appsetting,json文件中
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
#region minio客户端注入
var minioClient = new MinioClient(Configuration["MinIO:Endpoint"]
, Configuration["MinIO:AccessKey"]
, Configuration["MinIO:SecretKey"]);
services.AddSingleton(minioClient);
#endregion
services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "MinioDemo.WebApi", Version = "v1" });
});
}
appsetting.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
//minIO配置
"MinIO": {
//服务器IP
"Endpoint": "localhost:9090",
//账号
"AccessKey": "minioadmin",
//密码
"SecretKey": "12345678",
//默认存储桶
"Bucket": "test"
}
}
上传、下载代码
private static string bucketName = "test";//默认桶
private readonly MinioClient _client;
public MinIOController(MinioClient client)
{
_client = client;
}
/// <summary>
/// 上传附件
/// </summary>
/// <param name="files"></param>
/// <returns></returns>
[HttpPost("/file/UploadFile")]
public async Task<dynamic> UploadFile(List<IFormFile> files)
{
long size = files.Sum(f => f.Length);
try
{
bool found = await _client.BucketExistsAsync(bucketName);
//如果桶不存在则创建桶
if (!found)
{
await _client.MakeBucketAsync(bucketName);
}
foreach (var formFile in files)
{
string saveFileName = $"{Guid.NewGuid():N}{Path.GetExtension(formFile.FileName)}";//存储的文件名
string objectName = $"/{DateTime.Now:yyyy/MM/dd}/{saveFileName}";//文件保存路径
if (formFile.Length > 0)
{
Stream stream = formFile.OpenReadStream();
await _client.PutObjectAsync(bucketName,
objectName,
stream,
formFile.Length,
formFile.ContentType);
}
}
}
catch (MinioException e)
{
Console.WriteLine("文件上传错误: {0}", e.Message);
}
return Ok(new { count = files.Count, size });
}
/// <summary>
/// 下载附件
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
[HttpGet("/file/DownloadFile")]
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 e)
{
Console.Out.WriteLine("下载附件发生错误: " + e);
}
return File(memoryStream, GetContentType(fileName));
}
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
{
return "application/octet-stream";
}
}
}
}
测试#
上传测试,这里我用swagger执行测试UploadFile
minio控制台,成功
下载测试,这里直接拿刚刚上传成功的附件进行测试
扩展:更改访问策略,实现直接打开浏览文件
如果想要通过url地址直接打开文件,只需要改访问策略
进入minio控制台=》Buckets=>Manage=>Access Policy: Public
注:MinIO版本4以上不能使用以上方式进行初始化客户端
作者:gongxingwen
出处:https://www.cnblogs.com/dotnetSunset/p/17317647.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
本文来自博客园,作者:渡——已,转载请注明原文链接:https://www.cnblogs.com/dotnetSunset/p/17317647.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构