using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using TEAMModelOS.SDK.Context.Configuration;
using TEAMModelOS.SDK.Context.Exception;
using TEAMModelOS.SDK;
using TEAMModelOS.SDK.Helper.Common.JsonHelper;
using TEAMModelOS.SDK.Module.AzureBlob.Configuration;
using TEAMModelOS.SDK.DI;
using System.Net.Http;
using TEAMModelOS.SDK.Helper.Security.ShaHash;
using TEAMModelOS.SDK.Extension;
namespace TEAMModelOS.Controllers.Core
{
[Route("api/[controller]")]
[ApiController]
public class BlobController : ControllerBase
{
private readonly AzureStorageFactory _azureStorage;
private readonly SnowflakeId _snowflakeId;
private readonly IHttpClientFactory _clientFactory;
public BlobController(AzureStorageFactory azureStorage, SnowflakeId snowflakeId, IHttpClientFactory clientFactory)
{
_azureStorage = azureStorage;
_snowflakeId = snowflakeId;
_clientFactory = clientFactory;
}
///
/// 获取某个容器的只读权限
///
///
///
[HttpPost("blobSasR")]
public BaseResponse BlobSasR(BlobSas request)
{
///返回金钥过期时间
ResponseBuilder builder = new ResponseBuilder();
// Dictionary dict = await azureBlobDBRepository.GetBlobSasUri(request.@params,true);
// dict.Add(d.Key, d.Value);
return builder.Data(_azureStorage.GetContainerSasUri(request, true)).build();
}
///
/// 某个文件的上传SAS rcw权限
///
///
///
[HttpPost("blobSasRCW")]
public BaseResponse BlobSasRCW(BlobSas request)
{
///返回金钥过期时间
ResponseBuilder builder = new ResponseBuilder();
// Dictionary dict= await azureBlobDBRepository.GetBlobSasUri(request.@params,false);
// Dictionary dict = ;
//dict.Add(d.Key, d.Value);
return builder.Data(_azureStorage.GetContainerSasUri(request, false)).build();
}
///
/// 链接只读(读)
///
///
///
[HttpPost("urlSasR")]
public BaseResponse GetContainerSASRead(JsonElement azureBlobSASDto)
{
ResponseBuilder responseBuilder = new ResponseBuilder();
azureBlobSASDto.TryGetProperty("params", out JsonElement azureBlobSAS);
//string azureBlobSAS = azureBlobSASDto;
(string, string) a = BlobUrlString(azureBlobSAS.ToString());
string ContainerName = a.Item1;
string BlobName = a.Item2;
bool flg = IsBlobName(BlobName);
if (flg)
{
return responseBuilder.Data(_azureStorage.GetBlobSasUriRead(ContainerName, BlobName)).build();
}
else
{
return responseBuilder.Error(ResponseCode.PARAMS_ERROR, "文件名错误").build();
};
}
///
/// 获取文件内容
///
///
///
[HttpPost("getText")]
public async Task GetText(JsonElement request)
{
request.TryGetProperty("code", out JsonElement code);
ResponseBuilder responseBuilder = new ResponseBuilder();
string azureBlobSAS = System.Web.HttpUtility.UrlDecode(code.ToString(), Encoding.UTF8);
(string, string) a = BlobUrlString(azureBlobSAS);
string ContainerName = a.Item1;
string BlobName = a.Item2;
bool flg = IsBlobName(BlobName);
if (flg)
{
//TODO 需驗證
BlobAuth blobAuth= _azureStorage.GetBlobSasUriRead(ContainerName, BlobName);
var response= await _clientFactory.CreateClient().GetAsync(new Uri(blobAuth.url + blobAuth.sas));
response.EnsureSuccessStatusCode();
using var json = await JsonDocument.ParseAsync(await response.Content.ReadAsStreamAsync());
return responseBuilder.Data(json.RootElement).build();
}
else
{
return responseBuilder.Error(ResponseCode.PARAMS_ERROR, "文件名错误").build();
};
}
///
/// 测试单个文本内容的上传
///
///
///
[HttpPost("deleteBlob")]
public async Task DeleteBlob(JsonElement request)
{
ResponseBuilder responseBuilder = new ResponseBuilder();
var client = _azureStorage.GetBlobBatchClient().DeleteBlobs(new Uri[] {new Uri("https://teammodelstorage.blob.core.chinacloudapi.cn/ydzt/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9%2FAnimation.xml") });
return responseBuilder.Data(client[0].Status).build();
}
///
/// 测试单个文本内容的上传
///
///
///
[HttpPost("get-blobsize")]
public async Task GetBlobsSize(JsonElement request)
{
request.TryGetProperty("containerName", out JsonElement containerName);
var name =containerName.GetString();
var client = _azureStorage.GetBlobContainerClient(name);
var size = await client.GetBlobsSize();
return Ok(new { size });
}
///
/// 测试单个文本内容的上传
///
///
///
[HttpPost("testjson")]
public async Task Uploadtest(JsonElement request)
{
JsonElement json= await RedisHelper.CacheShellAsync("test:" + "test", "bbbbbbbbbbbbbbbbbbbbb", 3600, () => { return test(request); });
ResponseBuilder responseBuilder = new ResponseBuilder();
return responseBuilder.Data(RedisHelper.HGet("test:" + "test", "aaaaaaaaaaaaaaaaa")).build();
}
private Task test(JsonElement request)
{
return Task.FromResult(request);
}
private static string ContainerUrlString(string sasUrl)
{
///移除http://
sasUrl = sasUrl.Substring(8);
string[] sasUrls = sasUrl.Split("/");
string ContainerName;
ContainerName = sasUrls[1].Clone().ToString();
return ContainerName;
}
private static (string, string) BlobUrlString(string sasUrl)
{
sasUrl = sasUrl.Substring(8);
string[] sasUrls = sasUrl.Split("/");
string ContainerName;
ContainerName = sasUrls[1].Clone().ToString();
string item = sasUrls[0] + "/" + sasUrls[1] + "/";
string blob = sasUrl.Replace(item, "");
return (ContainerName, blob);
}
public static bool IsBlobName(string BlobName)
{
return System.Text.RegularExpressions.Regex.IsMatch(BlobName,
@"(?!((^(con)$)|^(con)\\..*|(^(prn)$)|^(prn)\\..*|(^(aux)$)|^(aux)\\..*|(^(nul)$)|^(nul)\\..*|(^(com)[1-9]$)|^(com)[1-9]\\..*|(^(lpt)[1-9]$)|^(lpt)[1-9]\\..*)|^\\s+|.*\\s$)(^[^\\\\\\:\\<\\>\\*\\?\\\\\\""\\\\|]{1,255}$)");
}
}
}