Storages3 0.5.1
See the version list below for details.
dotnet add package Storages3 --version 0.5.1
NuGet\Install-Package Storages3 -Version 0.5.1
<PackageReference Include="Storages3" Version="0.5.1" />
<PackageVersion Include="Storages3" Version="0.5.1" />
<PackageReference Include="Storages3" />
paket add Storages3 --version 0.5.1
#r "nuget: Storages3, 0.5.1"
#addin nuget:?package=Storages3&version=0.5.1
#tool nuget:?package=Storages3&version=0.5.1
Storage для S3
Привет! Это простейший клиент для работы с S3 хранилищами. Протестировано только на Minio, без https. Мотивация создания была простейшей - я не понимал, почему клиенты от AWS и Minio едят так много памяти. Для красоты эксперимента я добавил ещё один клиент, которы нашёл на github - клиент для Yandex Objects, который использовать строго не рекомендую.
BenchmarkDotNet=v0.13.5, OS=Windows 11 (10.0.22621.1265/22H2/2022Update/SunValley2)
AMD Ryzen 7 5800H with Radeon Graphics, 1 CPU, 16 logical and 8 physical cores
.NET SDK=7.0.102
[Host] : .NET 7.0.2 (7.0.222.60605), X64 RyuJIT AVX2 DEBUG
.NET 7.0 : .NET 7.0.2 (7.0.222.60605), X64 RyuJIT AVX2
Job=.NET 7.0 Runtime=.NET 7.0
Method | Mean | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
---|---|---|---|---|---|---|---|
Aws | 2.160 s | 1.65 | 25000.0000 | 8000.0000 | - | 207325.71 KB | 254.56 |
Minio | 1.280 s | 0.97 | - | - | - | 279978.45 KB | 343.76 |
Yandex | 1.539 s | 1.17 | 1000.0000 | 1000.0000 | 1000.0000 | 1033076.55 KB | 1,268.43 |
Storage | 1.318 s | 1.00 | - | - | - | 814.45 KB | 1.00 |
Создание клиента
Для работы с хранилищем необходимо создать клиент.
var storageClient = new StorageClient(new StorageSettings
{
AccessKey = "ROOTUSER",
Bucket = "mybucket",
EndPoint = "localhost",
Port = 9000,
SecretKey = "ChangeMe123",
})
Операции с S3 bucket
Создание bucket'a
Мы передаём название bucket'a в настройках, поэтому дополнительно его вводить не надо.
bool bucketCreateResult = await storageClient.CreateBucket(CancellationToken.None);
if (bucketCreateResult) Console.WriteLine("Bucket создан")
Проверка существования bucket'a
Как и в прошлый раз, мы знаем название bucket'a, так как мы передаём его в настройках клиента.
bool bucketCheckResult = await storageClient.BucketExists(CancellationToken.None);
if (bucketCheckResult) Console.WriteLine("Bucket существует")
Удаление bucket'a
bool bucketDeleteResult = await storageClient.BucketExists(CancellationToken.None);
if (bucketDeleteResult) Console.WriteLine("Bucket удалён")
Операции с S3 object
Напомню, что объект в смысле S3 это и есть файл.
Создание object'a
Создание, то есть загрузка файла в S3 хранилище, возможна двумя путями: с разбиением исходных данных на кусочки (multipart) и без этого. Самый простой способ загрузки файла, это воспользоваться сделующим методом (если файл будет больше 5 МБ, то применяется multipart):
bool fileUploadResult = await storageClient.UploadFile(fileName, fileStream, fileContentType, CancellationToken.None);
if (fileUploadResult) Console.WriteLine("Файл загружен")
Создание S3 объекта без Multipart
Можно принудительно загружать файл без multipart. Есть сигнатура и для byte[]
.
bool fileUploadResult = await storageClient.PutFile(fileName, byteArray, fileContentType, CancellationToken.None);
if (fileUploadResult) Console.WriteLine("Файл загружен")
Создание S3 объекта с использованием Multipart
Можно принудительно загружать файл с использованием multipart. В этом случае нужно будет явно указать размер одного кусочка (не менее 5 МБ).
bool fileUploadResult = await storageClient.PutFileMultipart(fileName, fileStream, fileContentType, partSize, CancellationToken.None);
if (fileUploadResult) Console.WriteLine("Файл загружен")
Проверка существования object'a
bool fileExistsResult = await storageClient.FileExists(fileName, CancellationToken.None);
if (fileExistsResult) Console.WriteLine("Файл существует")
Удаление object'a
Удаление объекта из S3 происходит почти мгновенно. Такое ощущение, что просто ставится задача на удаление и клиенту возвращается результат.
bool fileDeleteResult = await storageClient.DeleteFile(fileName, CancellationToken.None);
if (fileDeleteResult) Console.WriteLine("Файл удалён")
Тесты
Как запускать тесты через github actions
пока не придумал. Нужна же minio, а как вставить её я не знаю. Варианты нашёл, читаю.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net7.0
- Microsoft.AspNetCore.WebUtilities (>= 2.2.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.