// 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); } } }