前言
在上一篇文章《minio:安装部署并安装成windows服务》我们已经简单介绍过minio的基本情况,本文主要介绍如何在netcore webapi项目中如何操作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版本
<PackageReference Include="Minio" Version="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"
}
}
- 完整上传、下载代码
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Minio;
using Minio.Exceptions;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace MinioDemo.WebApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class MinIOController : ControllerBase
{
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
直接输入地址测试