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;
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 (var item in client.GetBlobsAsync(BlobTraits.None, BlobStates.None, prefix))
{
size += item.Properties.ContentLength;
};
return size;
}
catch
{
return null;
}
}
///
/// 系统管理员 资源,题目关联,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 azureStorageFactory, string name, string text, string folder, string fileName, bool contentTypeDefault = true)
{
// string groupName =folder;
BlobContainerClient blobContainer = azureStorageFactory.GetBlobContainerClient(name.ToLower().Replace("#", "")); //blobClient.GetContainerReference(groupName);
Uri url = blobContainer.Uri;
var blockBlob = blobContainer.GetBlobClient(folder + "/" + fileName);
string fileext = fileName.Substring(fileName.LastIndexOf(".") > 0 ? fileName.LastIndexOf(".") : 0);
string content_type = "application/octet-stream";
if (!contentTypeDefault)
{
ContentTypeDict.dict.TryGetValue(fileext, out string contenttype);
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);
blockBlob.SetHttpHeaders(new BlobHttpHeaders { ContentType = content_type });
AzureBlobModel model = new AzureBlobModel(fileName, name, folder, fileName, folder, content_type, bytes.Length)
{
Sha1Code = ShaHashHelper.GetSHA1(bytes),
BlobUrl = blockBlob.Uri.ToString()
};
return model;
}
}
}