AzureStorageBlobExtensions.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using System.Threading.Tasks;
  2. using Azure.Storage;
  3. using Azure.Storage.Blobs;
  4. using Azure.Storage.Blobs.Models;
  5. using TEAMModelOS.SDK.Module.AzureBlob.Configuration;
  6. using TEAMModelOS.SDK.Module.AzureBlob.Container;
  7. using TEAMModelOS.SDK.Context.Constant;
  8. using TEAMModelOS.SDK.Helper.Security.ShaHash;
  9. using System;
  10. using System.IO;
  11. namespace TEAMModelOS.SDK.DI
  12. {
  13. public static class AzureStorageBlobExtensions
  14. {
  15. /// <summary>
  16. /// 取得指定前置詞的 Blob 名稱的總大小(Bytes),例如指定目錄名稱為前置詞
  17. /// </summary>
  18. /// <param name="prefix">篩選開頭名稱,Null代表容器總大小</param>
  19. /// <returns>總大小(Bytes),如果為Null代表查無前置詞或者發生錯誤</returns>
  20. public static async Task<long?> GetBlobsSize(this BlobContainerClient client, string prefix = null)
  21. {
  22. long? size = 0;
  23. try
  24. {
  25. await foreach (var item in client.GetBlobsAsync(BlobTraits.None, BlobStates.None, prefix))
  26. {
  27. size += item.Properties.ContentLength;
  28. };
  29. return size;
  30. }
  31. catch
  32. {
  33. return null;
  34. }
  35. }
  36. /// <summary>
  37. /// 系统管理员 资源,题目关联,htex关联,学习活动学生上传文件关联,基本信息关联,教室平面图关联,评测冷数据关联
  38. /// "system": [ "res", "item", "htex", "task", "info", "room", "exam" ],
  39. /// 资源,题目关联,htex关联,学习活动学生上传文件关联,基本信息关联,教室平面图关联,评测冷数据关联
  40. /// "school": [ "res", "item", "htex", "task", "info", "room", "exam" ],
  41. /// 资源,题目关联,htex关联,学习活动关联,教师基本信息关联
  42. /// "teacher": [ "res", "item", "htex", "task", "info" ],
  43. /// 答案及学习活动上传的文件,学生基本信息关联
  44. ///"student": [ "stu/{studentId}/ans", "stu/{studentId}/task" ]
  45. /// </summary>
  46. /// <param name="name">容器名称</param>
  47. /// <param name="text">文件内容的流</param>
  48. /// <param name="folder">业务文件夹</param>
  49. /// <param name="fileName">文件名</param>
  50. /// <param name="contentTypeDefault">是否存放文件后缀对应的contentType</param>
  51. /// <returns></returns>
  52. public static async Task<AzureBlobModel> UploadFileByContainer(this AzureStorageFactory azureStorageFactory, string name, string text, string folder, string fileName, bool contentTypeDefault = true)
  53. {
  54. // string groupName =folder;
  55. BlobContainerClient blobContainer = azureStorageFactory.GetBlobContainerClient(name.ToLower().Replace("#", "")); //blobClient.GetContainerReference(groupName);
  56. Uri url = blobContainer.Uri;
  57. var blockBlob = blobContainer.GetBlobClient(folder + "/" + fileName);
  58. string fileext = fileName.Substring(fileName.LastIndexOf(".") > 0 ? fileName.LastIndexOf(".") : 0);
  59. string content_type = "application/octet-stream";
  60. if (!contentTypeDefault)
  61. {
  62. ContentTypeDict.dict.TryGetValue(fileext, out string contenttype);
  63. if (!string.IsNullOrEmpty(contenttype))
  64. {
  65. content_type = contenttype;
  66. }
  67. else
  68. {
  69. //blockBlob.Properties.ContentType = content_type;
  70. }
  71. }
  72. else
  73. {
  74. //blockBlob.Properties.ContentType = content_type;
  75. }
  76. byte[] bytes = System.Text.Encoding.Default.GetBytes(text);
  77. Stream streamBlob= new MemoryStream(bytes);
  78. await blockBlob.UploadAsync(streamBlob,true);
  79. blockBlob.SetHttpHeaders(new BlobHttpHeaders { ContentType = content_type });
  80. AzureBlobModel model = new AzureBlobModel(fileName, name, folder, fileName, folder, content_type, bytes.Length)
  81. {
  82. Sha1Code = ShaHashHelper.GetSHA1(bytes),
  83. BlobUrl = blockBlob.Uri.ToString()
  84. };
  85. return model;
  86. }
  87. }
  88. }