BatchCopyFileService.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Threading.Tasks;
  5. using TEAMModelOS.SDK.DI;
  6. using TEAMModelOS.SDK.Models.Cosmos.BI;
  7. using Azure.Storage.Blobs.Models;
  8. using Azure;
  9. using Azure.Storage.Sas;
  10. using System.Linq;
  11. using Azure.Storage.Blobs.Specialized;
  12. using System.Web;
  13. namespace TEAMModelOS.SDK.Models.Service
  14. {
  15. public class BatchCopyFileService
  16. {
  17. /// <summary>
  18. /// 执行批量复制操作方法
  19. /// </summary>
  20. /// <param name="_dingDing"></param>
  21. /// <param name="_azureStorage"></param>
  22. /// <param name="batchCopyFile"></param>
  23. /// <returns></returns>
  24. public static async Task<int> CopyFile(DingDing _dingDing,AzureStorageFactory _azureStorage, BatchCopyFile batchCopyFile)
  25. {
  26. try
  27. {
  28. List<Task<CopyFromUriOperation>> filelist = new(); //可复制256M以上文件
  29. //List<Task<Response<BlobCopyInfo>>> filelist = new(); //复制256M以下文件
  30. var azureClient = _azureStorage.GetBlobContainerClient($"{batchCopyFile.blobCntr}");//获取容器连接地址
  31. //先删除原有的文件
  32. List<Task<Response<bool>>> DelList = new();
  33. await foreach (BlobItem blobItem in azureClient.GetBlobsAsync(BlobTraits.None, BlobStates.None, $"yxpt/{batchCopyFile.newFileName}/"))
  34. {
  35. DelList.Add(azureClient.GetBlobBaseClient(blobItem.Name).DeleteIfExistsAsync());
  36. }
  37. if (DelList.Count <= 256)
  38. {
  39. await Task.WhenAll(DelList);
  40. }
  41. else
  42. {
  43. int pages = (DelList.Count + 255) / 256;
  44. for (int i = 0; i < pages; i++)
  45. {
  46. List<Task<Response<bool>>> delList = DelList.Skip((i) * 256).Take(256).ToList();
  47. await Task.WhenAll(delList);
  48. }
  49. }
  50. //查询目录下所有容器路径
  51. await foreach (BlobItem blobItem in azureClient.GetBlobsAsync(BlobTraits.None, BlobStates.None, $"yxpt/{batchCopyFile.oldFileName}/"))
  52. {
  53. string newurl = $"{blobItem.Name}".Replace($"/{batchCopyFile.oldFileName}/", $"/{batchCopyFile.newFileName}/");//替换成新的容器路径
  54. var urlSas = _azureStorage.GetBlobSAS($"{batchCopyFile.blobCntr}", blobItem.Name, BlobSasPermissions.Read | BlobSasPermissions.List); //获取容器sas和有效期
  55. filelist.Add(azureClient.GetBlobClient(newurl).StartCopyFromUriAsync(new Uri(urlSas))); //可复制256M以上文件
  56. //filelist.Add(azureClient.GetBlobClient(newurl).SyncCopyFromUriAsync(new Uri(urlSas))); //添加复制文件到集合执行复制操作 复制256M以下文件
  57. }
  58. if (filelist.Count <= 256)
  59. {
  60. await Task.WhenAll(filelist);
  61. }
  62. else
  63. {
  64. int pages = (filelist.Count + 255) / 256;
  65. for (int i = 0; i < pages; i++)
  66. {
  67. List<Task<CopyFromUriOperation>> rspBlobCopyInfos = filelist.Skip((i) * 256).Take(256).ToList(); //可复制256M以上文件
  68. //List<Task<Response<BlobCopyInfo>>> rspBlobCopyInfos = filelist.Skip((i) * 256).Take(256).ToList(); //复制256M以下文件
  69. await Task.WhenAll(rspBlobCopyInfos);
  70. }
  71. }
  72. return 200;
  73. }
  74. catch (Exception ex)
  75. {
  76. await _dingDing.SendBotMsg($"{Environment.GetEnvironmentVariable("Option:Location")}-Batch-CopyFile \n {ex.Message}\n{ex.StackTrace}", GroupNames.醍摩豆服務運維群組);
  77. return -1;
  78. }
  79. }
  80. /// <summary>
  81. /// 修复研修平台多人使用个账户,分开账户复制文件时使用
  82. /// </summary>
  83. /// <param name="_azureStorage"></param>
  84. /// <param name="blobName"></param>
  85. /// <param name="oldFile"></param>
  86. /// <param name="oldId"></param>
  87. /// <param name="newId"></param>
  88. /// <returns></returns>
  89. public static async Task<int> SingleCopyFile(AzureStorageFactory _azureStorage, string blobName, string oldFile, string oldId, string newId)
  90. {
  91. try
  92. {
  93. var azureClient = _azureStorage.GetBlobContainerClient($"{blobName}");//获取容器连接地址
  94. string newurl = oldFile.Substring(oldFile.IndexOf($"{blobName}/") + $"{blobName}/".Length).Replace($"{oldId}", $"{newId}");//替换成新的容器路径
  95. string oldFileName = oldFile.Substring(oldFile.IndexOf($"{blobName}/") + $"{blobName}/".Length);
  96. var urlSas = _azureStorage.GetBlobSAS($"{blobName}", $"{HttpUtility.UrlDecode(oldFileName)}", BlobSasPermissions.Read | BlobSasPermissions.List); //获取容器sas和有效期
  97. //var respCopy = azureClient.GetBlobClient(HttpUtility.UrlDecode(newurl)).SyncCopyFromUri(new Uri(urlSas)); //可复制256M以下文件
  98. var respCopy1 = await azureClient.GetBlobClient(HttpUtility.UrlDecode(newurl)).StartCopyFromUriAsync(new Uri(urlSas)); //可复制256M以上文件
  99. if (!string.IsNullOrEmpty($"{respCopy1.Id}"))
  100. return 200;
  101. else
  102. return 400;
  103. }
  104. catch(Exception ex)
  105. {
  106. return 400;
  107. }
  108. }
  109. }
  110. }