Storages3 0.5.3

There is a newer version of this package available.
See the version list below for details.
dotnet add package Storages3 --version 0.5.3
NuGet\Install-Package Storages3 -Version 0.5.3
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Storages3" Version="0.5.3" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Storages3 --version 0.5.3
#r "nuget: Storages3, 0.5.3"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Storages3 as a Cake Addin
#addin nuget:?package=Storages3&version=0.5.3

// Install Storages3 as a Cake Tool
#tool nuget:?package=Storages3&version=0.5.3

Pipeline NuGet NuGet CodeFactor

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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net7.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
0.6.3 46 4/27/2024
0.6.0 636 3/24/2023
0.5.9 604 3/12/2023
0.5.8 605 3/9/2023
0.5.7 556 3/9/2023
0.5.6 615 3/9/2023
0.5.5 592 3/8/2023
0.5.4 561 3/7/2023
0.5.3 575 3/6/2023