csharp
/// <summary>
/// Minio的WebHook回调地址
/// </summary>
/// <param name="callbackData"></param>
/// <returns></returns>
[HttpPost]
[AllowAnonymous] // 允许匿名访问此方法
public async Task<IActionResult> CallBack([FromBody] MinioCallback callbackData)
{
// 1. 验证是否接收到数据
if (callbackData == null)
{
_logger.LogError("未接收到任何数据,可能是JSON格式不匹配");
return BadRequest("未接收到有效数据");
}
// 2. 验证Records是否存在
if (callbackData.Records == null || !callbackData.Records.Any())
{
_logger.LogWarning("数据结构中没有Records数组");
return Ok(new { Status = "警告", Message = "没有事件记录", Data = callbackData });
}
//存储桶
string _bucketName = callbackData.Records.First().s3.bucket.name;
//文件名称携带路径
string _object_path_name = callbackData.Key.replace(_bucketName + "/", "");
string _file_name = callbackData.Key.split("/").Last();
string _curr_path = (callbackData.Key.Substring(0, callbackData.Key.LastIndexOf('/') + 1)).replace("/", "\\");
LogHelper.Info($"回调成功:{_curr_path}\\{_file_name}");
if (!callbackData.EventName.contains("Delete"))
{
var memoryStream = new MemoryStream();
GetObjectArgs getObjectArgs = new GetObjectArgs()
.WithBucket(_bucketName)
.WithObject(_object_path_name)
.WithCallbackStream((stream) =>
{
stream.CopyTo(memoryStream);
});
await _client.GetObjectAsync(getObjectArgs);
DirectoryInfo directoryInfo = new DirectoryInfo(@$"C:\Users\Rick\Desktop\杨大枫测试文件\下载的文件\{_curr_path}");
if (!directoryInfo.Exists)
{
directoryInfo.Create();
}
string pathsss = @$"C:\Users\Rick\Desktop\杨大枫测试文件\下载的文件\{_curr_path}\{_file_name}";
using FileStream targetFileStream = new FileStream(pathsss, FileMode.Create);
memoryStream.WriteTo(targetFileStream);
LogHelper.Info($"下载成功:{_curr_path}\\{_file_name}");
}
else
{
System.IO.File.Delete(@$"C:\Users\Rick\Desktop\杨大枫测试文件\下载的文件\{_curr_path}\{_file_name}");
_logger.LogInformation($"删除成功:{_curr_path}\\{_file_name}");
LogHelper.Info($"删除成功:{_curr_path}\\{_file_name}");
}
// 5. 返回详细信息便于调试
return Ok(new { Status = "成功", Message = "数据接收正常", Detail = "" });
}
实体类
csharp
public class MinioCallback
{
/// <summary>
/// 事件名称
/// </summary>
public string EventName { get; set; }
/// <summary>
/// 详细路径携带文件名字
/// </summary>
public string Key { get; set; }
public List<Records> Records { get; set; }
}
public class Records
{
// "eventVersion": "2.0",
//"eventSource": "minio:s3",
//"awsRegion": "",
//"eventTime": "2025-08-20T10:01:06.800Z",
//"eventName": "s3:ObjectCreated:Put",
// "userIdentity": {
// "principalId": "root"
//},
// "requestParameters": {
// "principalId": "root",
// "region": "",
// "sourceIPAddress": "127.0.0.1"
//},
// "responseElements": {
// "x-amz-id-2": "d0af7ef13e9a79de08686e85c361d9af88c5ebdbbacf07a734ab2c11fd85e57f",
// "x-amz-request-id": "185D715B531D4A58",
// "x-minio-deployment-id": "1e5f66fc-c3c1-4dfb-8878-70e62fb899cf",
// "x-minio-origin-endpoint": "http://127.0.0.1:9005"
//},
public S3 s3 { get; set; }
// "source": {
// "host": "127.0.0.1",
// "port": "",
// "userAgent": "MinIO (windows; amd64) minio-go/v7.0.91 MinIO Console/(dev)"
//}
}
public class S3
{
// "s3SchemaVersion": "1.0",
//"configurationId": "Config",
public Bucket bucket { get; set; }
public Object @object { get; set; }
}
public class Bucket
{
/// <summary>
/// 存储桶名称
/// </summary>
public string name { get; set; }
// "ownerIdentity": {
// "principalId": "root"
//},
//"arn": "arn:aws:s3:::yangdafengceshi"
}
public class Object
{
/// <summary>
/// key 对象的键(文件名)
/// </summary>
public string key { get; set; }
/// <summary>
/// size 对象大小(单位:字节)
/// </summary>
public long size { get; set; }
/// <summary>
/// eTag 实体标签(用于验证对象完整性)
/// </summary>
public string eTag { get; set; }
/// <summary>
/// contentType 内容类型(文件的MIME类型)
/// </summary>
public string contentType { get; set; }
/// <summary>
/// sequencer 序列号(用于标识对象操作的顺序)
/// </summary>
public string sequencer { get; set; }
}
注入
csharp
#region minio客户端注入
IMinioClient minioClient = new MinioClient()
.WithEndpoint("127.0.0.1:9005")
.WithCredentials("4TG1F2UV131LB8RMETLC", "D21QN7IZf7IUNuTJvRe07GsFMnCgYPt5BSFFTNQA")
//.WithSSL()
.Build();
builder.Services.AddSingleton<IMinioClient>(minioClient);
#endregion
private readonly UserService _UserService;//
private readonly ILogger<UserController> _logger;
private readonly JwtHelper _jwtHelper;
private readonly IMinioClient _client;
public UserController(UserService UserService, IMinioClient client,
ILogger<UserController> logger,
JwtHelper jwtHelper)
{
_UserService = UserService;
_logger = logger;
_jwtHelper = jwtHelper;
_client = client;
}