This commit is contained in:
2023-05-14 18:29:41 +03:00
parent ff965f08bd
commit ef329af61a
13 changed files with 455 additions and 95 deletions

View File

@@ -0,0 +1,17 @@
using Microsoft.AspNetCore.Http;
namespace anbs_cp.ForNet.Classes;
/// <summary>
/// Класс -- расширение для класса File
/// </summary>
public class NetFileExtension
{
/// <summary>
/// Получает MIME-тип файла
/// </summary>
/// <param name="file">Загружаемый файл</param>
/// <returns>MIME-тип файла</returns>
public static string MIMEType (IFormFile file) =>
file.ContentType;
}

View File

@@ -0,0 +1,38 @@
using System.Security.Cryptography;
using anbs_cp.Classes;
using Microsoft.AspNetCore.Http;
namespace anbs_cp.ForNet.Classes;
public static class NetFileHash
{
/// <summary>
/// Получение md5-хэша загружаемого файла.
/// Взято с https://stackoverflow.com/a/67081012/16469671
/// </summary>
/// <param name="file">Загружаемый файл</param>
/// <returns>Массив хэша</returns>
public static FileHash GetFileHash (IFormFile file)
{
//Создаю md5
using MD5 md5 = MD5.Create();
//Создаю поток для чтения
using StreamReader streamReader = new(file.OpenReadStream());
//Получаю строковый хэш
string hash = BitConverter.ToString(md5.ComputeHash(streamReader.BaseStream)).Replace("-", "")
.ToLowerInvariant();
//Создаю результат
FileHash fileHash = new();
//Вношу в него данные
fileHash.FromString(hash);
//Возвращаю результат
return fileHash;
}
}

View File

@@ -0,0 +1,35 @@
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Html;
namespace anbs_cp.ForNet.Classes;
/// <summary>
/// Расширение конвертера типов на манер Delphi
/// </summary>
public static class NetTypeConverter
{
#region Конвернтация IHtmlContent
/// <summary>
/// Преобразует тип <see cref="IHtmlContent"/> в строку <see cref="string"/>.
/// </summary>
/// <param name="content">Значение, которое нужно преобразовать.</param>
/// <returns><see cref="string"/></returns>
public static string HtmlContentToString(IHtmlContent content)
{
//Создаём writer
using StringWriter writer = new();
//Конвертируем IHtmlContent в string
content.WriteTo(writer, HtmlEncoder.Default);
//Возвращаем результат
return writer.ToString();
}
/// <summary>
/// Преобразует строку <see cref="string"/> в тип <see cref="IHtmlContent"/>.
/// </summary>
/// <param name="content">Значение, которое нужно преобразовать.</param>
/// <returns><see cref="IHtmlContent"/></returns>
public static IHtmlContent StringToHtmlContent(string content) => new HtmlContentBuilder().AppendHtml(content);
#endregion
}

View File

@@ -0,0 +1,110 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Primitives;
namespace anbs_cp.ForNet.Extensions;
/// <summary>
/// Расширение URLHelper
/// </summary>
public static class UrlHelperExtension
{
/// <summary>
/// Очищает URL, удаляя ненужные QueryString
/// </summary>
/// <param name="helper">
/// <see cref="IUrlHelper" />
/// </param>
/// <param name="context">
/// <see cref="HttpContext" />
/// </param>
/// <param name="url">Ссылка, которую нужно почистить</param>
/// <param name="clearQueryString">Массив ключей, которые нужно удалить</param>
/// <param name="getLocalURL">Возвращать только локальную ссылку</param>
/// <returns></returns>
public static string ParseURLQuery(this IUrlHelper helper, HttpContext context, string? url,
string[] clearQueryString, bool getLocalURL = true)
{
//Получаю returnURL
url ??= "/";
//Если адрес локальный, то преобразую в полный
if (helper.IsLocalUrl(url))
url = LocalToFullURL(helper, context, url);
//Создаю uri по адресу
Uri uri = new(url ?? "");
//Формат
const UriFormat format = UriFormat.UriEscaped;
//Формирую Uri-адрес сайта
string baseUri =
uri.GetComponents(UriComponents.Scheme | UriComponents.Host | UriComponents.Port,
format);
//Формирую локальную ссылку
string localUri = uri.GetComponents(UriComponents.Path, format);
//Создаю словарь запроса
Dictionary<string, StringValues> query = QueryHelpers.ParseQuery(uri.Query);
//Если он содержит параметр для очистки, то удаляю его
foreach (KeyValuePair<string, StringValues> queryItem in query.Where(queryItem =>
clearQueryString.Contains(queryItem.Key)))
query.Remove(queryItem.Key);
//Создаю список запроса, пригодный для QueryBuilder
List<KeyValuePair<string, string>> queryList = query.Select(static queryItem =>
new KeyValuePair<string, string>(queryItem.Key, queryItem.Value.ToString())).ToList();
//Запускаю построение новых параметров
QueryBuilder qBuilder = new(queryList);
//Создаю переменную-результат
string result = "";
//Если нужно получить полную ссылку
if (!getLocalURL)
result = baseUri;
//формирую переменную-результат
result = $"{result}/{localUri}{qBuilder.ToQueryString()}";
//Вывожу результат
return result;
}
/// <summary>
/// Получает локальный url-адрес
/// </summary>
/// <param name="helper"><see cref="IUrlHelper" /></param>
/// <param name="url">url-адрес</param>
/// <returns>Локальный url-адрес</returns>
public static string ToLocalURL (this IUrlHelper helper, string url)
{
//Создаю uri из url
Uri uri = new(url);
//Вывожу результат
return helper.IsLocalUrl(url) ? url : uri.PathAndQuery;
}
/// <summary>
/// Преобразует локальную ссылку в полную
/// </summary>
/// <param name="helper">
/// <see cref="IUrlHelper" />
/// </param>
/// <param name="context">
/// <see cref="HttpContext" />
/// </param>
/// <param name="url">Ссылка</param>
/// <returns>
/// <see cref="string" />
/// </returns>
public static string? LocalToFullURL (this IUrlHelper helper, HttpContext context, string? url) =>
helper.IsLocalUrl(url) ? $"{context.Request.Scheme}://{context.Request.Host}{url}" : url;
}

View File

@@ -0,0 +1,38 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<PackageId>ANBSoftware.ComponentsPackForNet</PackageId>
<Version>2023.05.14.1</Version>
<Authors>Александр Бабаев</Authors>
<Product>Набор компонентов ANB Software для ASP.NET Core</Product>
<Description>Библиотека полезных методов языка C# для ASP.NET Core</Description>
<Copyright>Александр Бабаев</Copyright>
<PackageProjectUrl>https://git.babaev-an.ru/babaev-an/anbsoftware_componentspack</PackageProjectUrl>
<RepositoryUrl>https://git.babaev-an.ru/babaev-an/anbsoftware_componentspack</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<RootNamespace>anbs_cp.ForNet</RootNamespace>
<AssemblyName>anbs_cp_fn</AssemblyName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Html.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="5.0.17" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.TagHelpers" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\anbs_cp\anbs_cp.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Extensions\" />
</ItemGroup>
</Project>