//
using Minio;
using Minio.Exceptions;
namespace SafeCampus.System;
///
/// Minio功能类
///
public class MinioUtils : ITransient
{
public MinioClient MinioClient;
private string _defaultBucketName;
private string _defaultEndPoint;
private string _defaultPrefix = "http://";
private readonly IConfigService _configService;
public MinioUtils(IConfigService configService)
{
_configService = configService;
InitClient();
}
///
/// 初始化操作
///
///
private async void InitClient()
{
var configs = await _configService.GetConfigsByCategory(CateGoryConst.CONFIG_FILE_MINIO);//获取minio配置
var accessKey = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_ACCESS_KEY).FirstOrDefault();//MINIO文件AccessKey
var secretKey = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_SECRET_KEY).FirstOrDefault();//MINIO文件SecretKey
var endPoint = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_END_POINT).FirstOrDefault();//MINIO文件EndPoint
var bucketName = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_DEFAULT_BUCKET_NAME).FirstOrDefault();//MINIO文件默认存储桶
if (accessKey == null || secretKey == null || endPoint == null || bucketName == null)
{
throw Oops.Oh("MINIO客户端未正确配置");
}
try
{
//默认值赋值
_defaultBucketName = bucketName.ConfigValue;
_defaultEndPoint = endPoint.ConfigValue;
if (_defaultEndPoint.ToLower().StartsWith("http"))
{
var point = _defaultEndPoint.Split("//").ToList();//分割、
_defaultPrefix = $"{point[0]}//";
_defaultEndPoint = point[1];
}
MinioClient = new MinioClient().WithEndpoint(_defaultEndPoint).WithCredentials(accessKey.ConfigValue, secretKey.ConfigValue)
.Build();//初始化minio对象
MinioClient.WithTimeout(5000);//超时时间
}
catch (Exception ex)
{
throw Oops.Oh("MINIO客户端启动失败", ex);
}
}
///
/// 上传文件 - 返回Minio文件完整Url
///
/// 存储桶里的对象名称,例:/mnt/photos/island.jpg
/// 文件
/// 文件的Content type,默认是"application/octet-stream"
///
public async Task PutObjectAsync(string objectName, IFormFile file, string contentType = "application/octet-stream")
{
try
{
using var fileStream = file.OpenReadStream();//获取文件流
var putObjectArgs = new PutObjectArgs().WithBucket(_defaultBucketName).WithObject(objectName).WithStreamData(fileStream)
.WithObjectSize(file.Length).WithContentType(contentType);
await MinioClient.PutObjectAsync(putObjectArgs);
return $"{_defaultPrefix}{_defaultEndPoint}/{_defaultBucketName}/{objectName}";//默认http
}
catch (MinioException e)
{
throw Oops.Oh("上传文件失败!", e);
}
catch (Exception e)
{
throw Oops.Oh("上传文件失败!", e);
}
}
///
/// 下载文件
///
///
///
public async Task DownloadFileAsync(string objectName)
{
var stream = new MemoryStream();
try
{
var getObjectArgs = new GetObjectArgs().WithBucket(_defaultBucketName).WithObject(objectName).WithCallbackStream(cb =>
{
cb.CopyTo(stream);
});
await MinioClient.GetObjectAsync(getObjectArgs);
//UserCenter.InvalidOperationException: Response Content-Length mismatch: too few bytes written (0 of 30788)
if (stream.CanSeek)
{
stream.Seek(0, SeekOrigin.Begin);
}
return stream;
}
catch (MinioException e)
{
throw Oops.Oh("下载文件失败!", e);
}
catch (Exception e)
{
throw Oops.Oh("下载文件失败!", e);
}
}
}