using System.Threading.Tasks;
using Azure.Storage;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using TEAMModelOS.SDK.Module.AzureBlob.Configuration;
using TEAMModelOS.SDK.Module.AzureBlob.Container;
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;
using System.Linq;
using System.Text;
using Azure.Core;
namespace TEAMModelOS.SDK.DI
{
public static class AzureStorageBlobExtensions
{
///
/// 取得指定前置詞的 Blob 名稱的總大小(Bytes),例如指定目錄名稱為前置詞
///
/// 篩選開頭名稱,Null代表容器總大小
/// 總大小(Bytes),如果為Null代表查無前置詞或者發生錯誤
public static async Task GetBlobsSize(this BlobContainerClient client, string prefix = null)
{
long? size = 0;
try
{
await foreach (BlobItem item in client.GetBlobsAsync(BlobTraits.None, BlobStates.None, prefix))
{
size += item.Properties.ContentLength;
};
return size;
}
catch
{
return size;
}
}
///
/// 取得指定前置詞的 Blob 名稱的總大小(Bytes),例如指定目錄名稱為前置詞
///
/// 篩選開頭名稱,Null代表容器總大小
/// 總大小(Bytes),如果為Null代表查無前置詞或者發生錯誤
public static async Task<(long?, Dictionary)> GetBlobsCatalogSize(this BlobContainerClient client, string prefix = null)
{
long? size = 0;
Dictionary dict = new Dictionary();
try
{
List> foderSize = new List>();
await foreach (BlobItem item in client.GetBlobsAsync(BlobTraits.None, BlobStates.None, prefix))
{
var len = item.Properties.ContentLength;
foderSize.Add(new KeyValuePair(item.Name.Split("/")[0], len));
size += item.Properties.ContentLength;
};
foderSize.Select(x => new { x.Key, x.Value }).GroupBy(y=>y.Key).ToList().ForEach(g=> {
var gpsize = g.Select(m => m.Value).Sum();
dict[g.Key] = gpsize;
});
return (size, dict);
}
catch
{
return (size, dict);
}
}
public class OptUrl
{
public string url { get; set; }
public long size { get; set; }
}
///
/// 取得指定前置詞的 Blob 名稱的總大小(Bytes),例如指定目錄名稱為前置詞
///
/// 多个文件的连接/param>
/// 總大小(Bytes),如果為Null代表查無前置詞或者發生錯誤
public static async Task> GetBlobsSize(this BlobContainerClient client, List urls)
{
List optUrls = new List();
try
{
if (urls != null) {
foreach (var url in urls)
{
OptUrl optUrl = new OptUrl { url = url, size = 0 };
var eurl = System.Web.HttpUtility.UrlDecode(url, Encoding.UTF8);
var blob = client.GetBlobClient(eurl);
if (blob.Exists())
{
var props = await blob.GetPropertiesAsync();
var size = props.Value.ContentLength;
optUrl.size = size;
}
optUrls.Add(optUrl);
}
}
return optUrls;
}
catch
{
return optUrls;
}
}
///
/// 批量刪除Blobs
///
/// 篩選開頭名稱,Null代表容器
public static async Task DelectBlobs(this BlobServiceClient client, string blobContainerName, List blobs = null)
{
try
{
BlobContainerClient bcc = client.GetBlobContainerClient(blobContainerName);
BlobBatchClient bbc = client.GetBlobBatchClient();
if (blobs.Count <= 256)
{
await bbc.DeleteBlobsAsync(blobs);
return true;
}
else
{
int pages = (blobs.Count + 255) / 256; //256是批量操作最大值,pages = (total + max -1) / max;
for (int i = 0; i < pages; i++)
{
List lists = blobs.Skip((i) * 256).Take(256).ToList();
await bbc.DeleteBlobsAsync(lists);
}
return true;
}
}
catch
{
return false;
}
}
///
/// 批量刪除Blobs
///
/// 篩選開頭名稱,Null代表容器
public static async Task 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 blobs = new List();
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);
};
if (blobs.Count <= 256)
{
await bbc.DeleteBlobsAsync(blobs);
return true;
}
else
{
int pages = (blobs.Count + 255) / 256; //256是批量操作最大值,pages = (total + max -1) / max;
for (int i = 0; i < pages; i++)
{
List lists = blobs.Skip((i) * 256).Take(256).ToList();
await bbc.DeleteBlobsAsync(lists);
}
return true;
}
}
catch
{
return false;
}
}
///
/// 系统管理员 资源,题目关联,htex关联,学习活动学生上传文件关联,基本信息关联,教室平面图关联,评测冷数据关联
/// "system": [ "res", "item", "htex", "task", "info", "room", "exam" ],
/// 资源,题目关联,htex关联,学习活动学生上传文件关联,基本信息关联,教室平面图关联,评测冷数据关联
/// "school": [ "res", "item", "htex", "task", "info", "room", "exam" ],
/// 资源,题目关联,htex关联,学习活动关联,教师基本信息关联
/// "teacher": [ "res", "item", "htex", "task", "info" ],
/// 答案及学习活动上传的文件,学生基本信息关联
///"student": [ "stu/{studentId}/ans", "stu/{studentId}/task" ]
///
/// 容器名称
/// 文件内容的流
/// 业务文件夹
/// 文件名
/// 是否存放文件后缀对应的contentType
///
public static async Task UploadFileByContainer(this AzureStorageFactory azureStorage, string name, string json, string root , string blobpath, bool contentTypeDefault = true)
{
// string groupName =folder;
BlobContainerClient blobContainer = azureStorage.GetBlobContainerClient(name.ToLower().Replace("#", "")); //blobClient.GetContainerReference(groupName);
var blockBlob = blobContainer.GetBlobClient($"{root}/{blobpath}");
string content_type = "application/octet-stream";
if (!contentTypeDefault)
{
string fileext = blobpath.Substring(blobpath.LastIndexOf(".") > 0 ? blobpath.LastIndexOf(".") : 0);
ContentTypeDict.dict.TryGetValue(fileext, out string contenttype);
if (!string.IsNullOrEmpty(contenttype))
{
content_type = contenttype;
}
}
byte[] bytes = System.Text.Encoding.Default.GetBytes(json);
Stream streamBlob = new MemoryStream(bytes);
await blockBlob.UploadAsync(streamBlob, true);
blockBlob.SetHttpHeaders(new BlobHttpHeaders { ContentType = content_type });
return blockBlob.Uri.ToString();
}
///
/// 系统管理员 资源,题目关联,htex关联,学习活动学生上传文件关联,基本信息关联,教室平面图关联,评测冷数据关联
/// "system": [ "res", "item", "htex", "task", "info", "room", "exam" ],
/// 资源,题目关联,htex关联,学习活动学生上传文件关联,基本信息关联,教室平面图关联,评测冷数据关联
/// "school": [ "res", "item", "htex", "task", "info", "room", "exam" ],
/// 资源,题目关联,htex关联,学习活动关联,教师基本信息关联
/// "teacher": [ "res", "item", "htex", "task", "info" ],
/// 答案及学习活动上传的文件,学生基本信息关联
///"student": [ "stu/{studentId}/ans", "stu/{studentId}/task" ]
///
/// 容器名称
/// 文件内容的流
/// 业务文件夹
/// 文件名
/// 是否存放文件后缀对应的contentType
///
public static async Task UploadFileByContainer(this AzureStorageFactory azureStorage, string name, Stream stream, string root, string blobpath, bool contentTypeDefault = true)
{
BlobContainerClient blobContainer = azureStorage.GetBlobContainerClient(name.ToLower().Replace("#", "")); //blobClient.GetContainerReference(groupName);
Uri url = blobContainer.Uri;
var blockBlob = blobContainer.GetBlobClient($"{root}/{blobpath}");
string content_type = "application/octet-stream";
if (!contentTypeDefault)
{
string fileext = blobpath.Substring(blobpath.LastIndexOf(".") > 0 ? blobpath.LastIndexOf(".") : 0);
ContentTypeDict.dict.TryGetValue(fileext, out string contenttype);
if (!string.IsNullOrEmpty(contenttype))
{
content_type = contenttype;
}
}
await blockBlob.UploadAsync(stream, true);
blockBlob.SetHttpHeaders(new BlobHttpHeaders { ContentType = content_type });
return blockBlob.Uri.ToString();
}
}
}