 使用Webhook实时同步文件)
前言使用MinIO的过程中我们这里遇到个需求系统需要预览3D文件前端操作用浏览3D文件的工具打开3D文件的目录即可实现在线预览功能这个时候问题来了MinIO上传文件后进行了编译如下图这个时候在想读取文件比如xx\xx\bb.txt是读取不到的所以要在上传文件的时候再其他文件夹内把上传的文件保存下来给前端读取使用。一开始想的是放到同文件夹下但是测试发现虽然MinIO上传的文件夹名字是bb.txt但是保存的文件无法与bb.txt文件夹放到同一目录下。第一步 开发同步文件的程序新建一个WebApi项目其中配置信息与上一篇文章一样这里不在赘述主要讲一下区别点配置中的BucketDirectory: D:\\aaa\\bbb\\ccc是指文件要保存的目录。这套程序部署在服务器上文件上传或删除后同步文件到服务器的文件夹下。保存文件的主要代码using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Minio; using Newtonsoft.Json; using System.IO; using System.Linq; using System.Threading.Tasks; namespace MinIOTest.Controllers { public class MinioCallbackController : ControllerBase { private static string _bucketName string.Empty;//demo;//默认桶 private readonly MinioClient _client; private readonly IConfiguration _configuration; private readonly ILoggerMinioCallbackController _logger; public MinioCallbackController(MinioClient client, IConfiguration configuration, ILoggerMinioCallbackController logger) { _client client; _configuration configuration; _bucketName configuration[MinIO:Bucket]; _logger logger; } [Route(/path)] //这里不能随便改要与webhook配置的路径对应 [HttpPost] //public IActionResult Post([FromBody]Dictionarystring,object args) public async TaskIActionResult CallBack([FromBody] object args) { try { //_logger.LogInformation(aaaaaaaaaaa); string jsonStr args.ToString(); var jsonObj JsonConvert.DeserializeObjectRoot(jsonStr); string bucketDirectory _configuration[MinIO:BucketDirectory];//文件保存目录 var pathAll jsonObj.Key;//获取文件路径 var fileName pathAll.Split(/).Last(); //新增 if (jsonObj.EventName.Contains(Put)) { if (!System.IO.File.Exists(bucketDirectory)) { DirectoryInfo directoryInfo new DirectoryInfo(bucketDirectory); directoryInfo.Create(); } var memoryStream new MemoryStream(); var path jsonObj.Key.Substring(pathAll.IndexOf(/) 1, pathAll.Length - pathAll.IndexOf(/) - 1); await _client.GetObjectAsync(_bucketName, path, (stream) { stream.CopyTo(memoryStream); }); using FileStream targetFileStream new FileStream(${bucketDirectory}\\{fileName}, FileMode.OpenOrCreate); memoryStream.WriteTo(targetFileStream); } else if (jsonObj.EventName.Contains(Delete)) { var path ${bucketDirectory}\\{fileName}; System.IO.File.Delete(path); } return Ok(); } catch (System.Exception ex) { _logger.LogError($ERROR:{ex}); } return null; } } }注意路由[Route(/path)]这里是一个路径要与下面配置Webhook时的路径一致。Root类这个实体写复杂了其实只要第一层结构就行这里往里面加了好几层按实际情况来吧。using MinIOTest; using System.Collections.Generic; namespace MinIOTest { public class ValueKind { } public class UserIdentity { /// summary /// /// /summary public string principalId { get; set; } } public class object { /// summary /// /// /summary public string key { get; set; } /// summary /// /// /summary public int size { get; set; } /// summary /// /// /summary public string eTag { get; set; } /// summary /// /// /summary public string contentType { get; set; } /// summary /// /// /summary public object userMetadata { get; set; } /// summary /// /// /summary public string sequencer { get; set; } } public class S3 { /// summary /// /// /summary public string s3SchemaVersion { get; set; } /// summary /// /// /summary public string configurationId { get; set; } /// summary /// /// /summary public object bucket { get; set; } /// summary /// /// /summary public object object { get; set; } } public class Source { /// summary /// /// /summary public string host { get; set; } /// summary /// /// /summary public string port { get; set; } /// summary /// /// /summary public string userAgent { get; set; } } public class RecordsItem { /// summary /// /// /summary public string eventVersion { get; set; } /// summary /// /// /summary public string eventSource { get; set; } /// summary /// /// /summary public string awsRegion { get; set; } /// summary /// /// /summary public string eventTime { get; set; } /// summary /// /// /summary public string eventName { get; set; } /// summary /// /// /summary public UserIdentity userIdentity { get; set; } /// summary /// /// /summary public object requestParameters { get; set; } /// summary /// /// /summary public object responseElements { get; set; } /// summary /// /// /summary public S3 s3 { get; set; } /// summary /// /// /summary public Source source { get; set; } } public class Root { /// summary /// /// /summary public string EventName { get; set; } /// summary /// demo/工程图纸/001/bb.txt /// /summary public string Key { get; set; } /// summary /// /// /summary public ListRecordsItem Records { get; set; } } }第二步 配置Webhook当走到下面这一步的时候要提前把服务打开服务地址一般是http://192.168.x.xx:5000服务不打开的话下一步创建会失败一般会有类似“远程服务拒绝连接”的提示。说的直白一点就是上面写的同步文件的程序要运行起来。创建完成后是看不到新创建的内容的需要把MinIO服务重启一下才行重启服务方式见下图点击重新启动或者停止-开始注意部署的过程中发现一个问题有些电脑需要重启服务有些电脑不需要重启服务就能看到新建的Webhook如果新建完成就能看到结果那就别重启服务了如果服务正常连接状态显示online如果服务异常显示offline这种情况一般是服务没启动起来需要检查服务保存完成后在这里可以看到新建的事件在代码里加上断点当上传文件或下载文件的时候会命中断点可以查看相关参数。上一篇MinIO 二 .net core中实现上传下载下一篇abp vnext MinIO四实现大文件上传