• MinIO (三) 使用Webhook实时同步文件


    前言

    使用MinIO的过程中,我们这里遇到个需求,系统需要预览3D文件,前端操作,用浏览3D文件的工具打开3D文件的目录即可实现在线预览功能,这个时候问题来了,MinIO上传文件后进行了编译,如下图

    这个时候在想读取文件(比如xx\xx\bb.txt),是读取不到的,所以,要在上传文件的时候再其他文件夹内,把上传的文件保存下来,给前端读取使用。一开始想的是放到同文件夹下,但是测试发现,虽然MinIO上传的文件夹名字是bb.txt,但是保存的文件无法与bb.txt文件夹放到同一目录下。

    第一步 开发同步文件的程序

    新建一个WebApi项目,其中配置信息与上一篇文章一样,这里不在赘述,主要讲一下区别点

    配置中的"BucketDirectory": "D:\\aaa\\bbb\\ccc",是指文件要保存的目录

    保存文件的主要代码

    1. using Microsoft.AspNetCore.Mvc;
    2. using Microsoft.Extensions.Configuration;
    3. using Microsoft.Extensions.Logging;
    4. using Minio;
    5. using Newtonsoft.Json;
    6. using System.IO;
    7. using System.Linq;
    8. using System.Threading.Tasks;
    9. namespace MinIOTest.Controllers
    10. {
    11. public class MinioCallbackController : ControllerBase
    12. {
    13. private static string _bucketName = string.Empty;//"demo";//默认桶
    14. private readonly MinioClient _client;
    15. private readonly IConfiguration _configuration;
    16. private readonly ILogger _logger;
    17. public MinioCallbackController(MinioClient client,
    18. IConfiguration configuration,
    19. ILogger logger)
    20. {
    21. _client = client;
    22. _configuration = configuration;
    23. _bucketName = configuration["MinIO:Bucket"];
    24. _logger = logger;
    25. }
    26. [Route("/path")] //这里不能随便改,要与webhook配置的路径对应
    27. [HttpPost]
    28. //public IActionResult Post([FromBody]Dictionary args)
    29. public async Task CallBack([FromBody] object args)
    30. {
    31. try
    32. {
    33. //_logger.LogInformation("aaaaaaaaaaa");
    34. string jsonStr = args.ToString();
    35. var jsonObj = JsonConvert.DeserializeObject(jsonStr);
    36. string bucketDirectory = _configuration["MinIO:BucketDirectory"];//文件保存目录
    37. var pathAll = jsonObj.Key;//获取文件路径
    38. var fileName = pathAll.Split('/').Last();
    39. //新增
    40. if (jsonObj.EventName.Contains("Put"))
    41. {
    42. if (!System.IO.File.Exists(bucketDirectory))
    43. {
    44. DirectoryInfo directoryInfo = new DirectoryInfo(bucketDirectory);
    45. directoryInfo.Create();
    46. }
    47. var memoryStream = new MemoryStream();
    48. var path = jsonObj.Key.Substring(pathAll.IndexOf('/') + 1, pathAll.Length - pathAll.IndexOf('/') - 1);
    49. await _client.GetObjectAsync(_bucketName, path,
    50. (stream) =>
    51. {
    52. stream.CopyTo(memoryStream);
    53. });
    54. using FileStream targetFileStream = new FileStream($"{bucketDirectory}\\{fileName}", FileMode.OpenOrCreate);
    55. memoryStream.WriteTo(targetFileStream);
    56. }
    57. else if (jsonObj.EventName.Contains("Delete"))
    58. {
    59. var path = $"{bucketDirectory}\\{fileName}";
    60. System.IO.File.Delete(path);
    61. }
    62. return Ok();
    63. }
    64. catch (System.Exception ex)
    65. {
    66. _logger.LogError($"ERROR:{ex}");
    67. }
    68. return null;
    69. }
    70. }
    71. }

    注意路由[Route("/path")],这里是一个路径,要与下面配置Webhook时的路径一致。

    Root类

    这个实体写复杂了,其实只要第一层结构就行,这里往里面加了好几层,按实际情况来吧。

    1. using MinIOTest;
    2. using System.Collections.Generic;
    3. namespace MinIOTest
    4. {
    5. public class ValueKind
    6. {
    7. }
    8. public class UserIdentity
    9. {
    10. ///
    11. ///
    12. ///
    13. public string principalId { get; set; }
    14. }
    15. public class @object
    16. {
    17. ///
    18. ///
    19. ///
    20. public string key { get; set; }
    21. ///
    22. ///
    23. ///
    24. public int size { get; set; }
    25. ///
    26. ///
    27. ///
    28. public string eTag { get; set; }
    29. ///
    30. ///
    31. ///
    32. public string contentType { get; set; }
    33. ///
    34. ///
    35. ///
    36. public object userMetadata { get; set; }
    37. ///
    38. ///
    39. ///
    40. public string sequencer { get; set; }
    41. }
    42. public class S3
    43. {
    44. ///
    45. ///
    46. ///
    47. public string s3SchemaVersion { get; set; }
    48. ///
    49. ///
    50. ///
    51. public string configurationId { get; set; }
    52. ///
    53. ///
    54. ///
    55. public object bucket { get; set; }
    56. ///
    57. ///
    58. ///
    59. public @object @object { get; set; }
    60. }
    61. public class Source
    62. {
    63. ///
    64. ///
    65. ///
    66. public string host { get; set; }
    67. ///
    68. ///
    69. ///
    70. public string port { get; set; }
    71. ///
    72. ///
    73. ///
    74. public string userAgent { get; set; }
    75. }
    76. public class RecordsItem
    77. {
    78. ///
    79. ///
    80. ///
    81. public string eventVersion { get; set; }
    82. ///
    83. ///
    84. ///
    85. public string eventSource { get; set; }
    86. ///
    87. ///
    88. ///
    89. public string awsRegion { get; set; }
    90. ///
    91. ///
    92. ///
    93. public string eventTime { get; set; }
    94. ///
    95. ///
    96. ///
    97. public string eventName { get; set; }
    98. ///
    99. ///
    100. ///
    101. public UserIdentity userIdentity { get; set; }
    102. ///
    103. ///
    104. ///
    105. public object requestParameters { get; set; }
    106. ///
    107. ///
    108. ///
    109. public object responseElements { get; set; }
    110. ///
    111. ///
    112. ///
    113. public S3 s3 { get; set; }
    114. ///
    115. ///
    116. ///
    117. public Source source { get; set; }
    118. }
    119. public class Root
    120. {
    121. ///
    122. ///
    123. ///
    124. public string EventName { get; set; }
    125. ///
    126. /// demo/工程图纸/001/bb.txt
    127. ///
    128. public string Key { get; set; }
    129. ///
    130. ///
    131. ///
    132. public List Records { get; set; }
    133. }
    134. }

    第二步 配置Webhook

    当走到下面这一步的时候,要提前把服务打开,服务地址一般是http://192.168.x.xx:5000,服务不打开的话,下一步创建会失败,一般会有类似“远程服务拒绝连接”的提示。说的直白一点,就是上面写的同步文件的程序要运行起来。

    创建完成后,是看不到新创建的内容的,需要把MinIO服务重启一下才行,重启服务方式见下图,点击重新启动,或者停止-开始(注意:部署的过程中发现一个问题,有些电脑需要重启服务,有些电脑不需要重启服务就能看到新建的Webhook,如果新建完成就能看到结果,那就别重启服务了)

    如果服务正常连接,状态显示online

    如果服务异常,显示offline,这种情况一般是服务没启动起来,需要检查服务

    保存完成后,在这里可以看到新建的事件

    在代码里加上断点,当上传文件或下载文件的时候,会命中断点,可以查看相关参数。

    上一篇:MinIO (二) .net core中实现上传下载

  • 相关阅读:
    SpringMVC-整合详解
    PX4模块设计之二十:PX4应用平台初始化
    2022年全球市场氨苯蝶啶原料药总体规模、主要生产商、主要地区、产品和应用细分研究报告
    【C#】【源码】直接可用的远程桌面应用
    StarRocks从入门到精通系列五:导入数据
    正文Delphi XE Android下让TMemo不自动弹出键盘
    4. DDPM, DDIM, Analytic-DPM, Extended Analytic-DPM
    ubuntu20.10 Qt4.8.7 kits 设置全志Lctech Pi V3s arm交叉编译工具
    uni-app网络请求封装及发送
    C# 结构型设计模式----适配器模式
  • 原文地址:https://blog.csdn.net/qq_22325259/article/details/133880591