Просмотр исходного кода

sdk 新增批量刪除支持256個操作

JAELYS 4 лет назад
Родитель
Сommit
e40e1e43f6
1 измененных файлов с 41 добавлено и 9 удалено
  1. 41 9
      TEAMModelOS.SDK/DI/AzureStorage/AzureStorageBlobExtensions.cs

+ 41 - 9
TEAMModelOS.SDK/DI/AzureStorage/AzureStorageBlobExtensions.cs

@@ -8,6 +8,8 @@ using TEAMModelOS.SDK.Context.Constant;
 using TEAMModelOS.SDK.Helper.Security.ShaHash;
 using System;
 using System.IO;
+using Azure.Storage.Blobs.Specialized;
+using System.Collections.Generic;
 
 namespace TEAMModelOS.SDK.DI
 {
@@ -22,19 +24,49 @@ namespace TEAMModelOS.SDK.DI
         {
             long? size = 0;
             try
-            {                
+            {
                 await foreach (var item in client.GetBlobsAsync(BlobTraits.None, BlobStates.None, prefix))
                 {
                     size += item.Properties.ContentLength;
                 };
                 return size;
             }
-            catch 
+            catch
             {
                 return size;
             }
         }
 
+        /// <summary>
+        /// 批量刪除Blobs
+        /// 注意單個批次最多支持256個子請求。批處理請求的正文大小不能超過4MB,超過返回False
+        /// </summary>      
+        /// <param name="prefix">篩選開頭名稱,Null代表容器</param>        
+        public static async Task<bool> DelectBlobs(this BlobServiceClient client, string blobContainerName, string prefix = null)
+        {
+            if (string.IsNullOrWhiteSpace(prefix)) return false;
+
+            try
+            {
+                BlobContainerClient bcc = client.GetBlobContainerClient(blobContainerName);
+                BlobBatchClient bbc = client.GetBlobBatchClient();
+                List<Uri> blobs = new List<Uri>();
+                await foreach (var item in bcc.GetBlobsAsync(BlobTraits.None, BlobStates.None, prefix))
+                {
+                    var urib = new UriBuilder(bcc.Uri);
+                    urib.Path += "/" + item.Name;
+                    blobs.Add(urib.Uri);
+                };
+
+                await bbc.DeleteBlobsAsync(blobs);
+                return true;
+            }
+            catch
+            {
+                return false;
+            }
+        }
+
         /// <summary>
         /// 系统管理员 资源,题目关联,htex关联,学习活动学生上传文件关联,基本信息关联,教室平面图关联,评测冷数据关联
         /// "system": [ "res", "item", "htex", "task", "info", "room", "exam" ],
@@ -56,7 +88,7 @@ namespace TEAMModelOS.SDK.DI
 
             // string groupName =folder;
 
-            BlobContainerClient blobContainer =  azureStorage.GetBlobContainerClient(name.ToLower().Replace("#", "")); //blobClient.GetContainerReference(groupName); 
+            BlobContainerClient blobContainer = azureStorage.GetBlobContainerClient(name.ToLower().Replace("#", "")); //blobClient.GetContainerReference(groupName); 
             Uri url = blobContainer.Uri;
 
             var blockBlob = blobContainer.GetBlobClient(folder + "/" + fileName);
@@ -68,23 +100,23 @@ namespace TEAMModelOS.SDK.DI
                 if (!string.IsNullOrEmpty(contenttype))
                 {
                     content_type = contenttype;
-                    
-                    
+
+
                 }
                 else
                 {
-                   
+
                     //blockBlob.Properties.ContentType = content_type;
                 }
             }
             else
             {
-               
+
                 //blockBlob.Properties.ContentType = content_type;
             }
             byte[] bytes = System.Text.Encoding.Default.GetBytes(text);
-            Stream streamBlob= new MemoryStream(bytes);
-            await blockBlob.UploadAsync(streamBlob,true);
+            Stream streamBlob = new MemoryStream(bytes);
+            await blockBlob.UploadAsync(streamBlob, true);
             blockBlob.SetHttpHeaders(new BlobHttpHeaders { ContentType = content_type });
             AzureBlobModel model = new AzureBlobModel(fileName, name, folder, fileName, folder, content_type, bytes.Length)
             {