88
99Привет! Это обертка над HttpClient для работы с S3 хранилищами. Мотивация создания была простейшей - я не понимал,
1010почему клиенты [ AWS] ( https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/welcome.html )
11- и [ Minio] ( https://github.com/minio/minio-dotnet ) едят так много памяти . Результат моих экспериментов: скорость
11+ и [ Minio] ( https://github.com/minio/minio-dotnet ) едят так много памяти. Результат моих экспериментов: скорость
1212почти как у Minio, а памяти потребляю почти в 200 раз меньше, чем клиент для AWS.
1313
1414``` ini
@@ -18,13 +18,13 @@ Unknown processor
1818[Host] : .NET 8.0.4 (8.0.424.16909), Arm64 RyuJIT AdvSIMD
1919.NET 8.0 : .NET 8.0.4 (8.0.424.16909), Arm64 RyuJIT AdvSIMD
2020
21- Job =.NET 8.0 Runtime =.NET 8.0
21+ Job =.NET 8.0 Runtime =.NET 8.0
2222```
23- | Method | Mean | Error | StdDev | Ratio | RatioSD | Gen0 | Gen1 | Allocated | Alloc Ratio |
24- | -------- | --------:| --------- :| ---------: | ------ :| --------: | ----------- :| ----------: | -------------:| ------------:|
25- | Aws | 1.51 s | 0.030 s | 0.035 s | 1.42 | 0.03 | 80000.00 | 5000.00 | 201710 KB | 420.92 |
26- | Minio | 1.48 s | 0.027 s | 0.023 s | 1.39 | 0.02 | - | - | 279524 KB | 583.30 |
27- | Storage | 1.06 s | 0.014 s | 0.013 s | 1.00 | 0.00 | - | - | 479 KB | 1.00 |
23+ | Method | Mean | Ratio | Gen0 | Gen1 | Allocated | Alloc Ratio |
24+ | -------- | --------:| ------:| ------------:| -----------:| --------------:| ------------:|
25+ | Aws | 1.497 s | 1.45 | 80 000 | 6 000 | 201 728.07 KB | 333.24 |
26+ | Minio | 1.468 s | 1.43 | - | - | 279 532.97 KB | 461.76 |
27+ | Storage | 1.031 s | 1.00 | - | - | 605.36 KB | 1.00 |
2828
2929## Создание клиента
3030
@@ -57,7 +57,7 @@ Amazon S3 не тестировался.
5757bool bucketCreateResult = await storageClient .CreateBucket (cancellationToken );
5858Console .WriteLine (bucketCreateResult
5959 ? " Bucket создан"
60- : $ " Bucket не был создан" );
60+ : " Bucket не был создан" );
6161```
6262
6363### Проверка существования bucket'a
@@ -100,8 +100,8 @@ if (fileUploadResult) Console.WriteLine("Файл загружен");
100100
101101using S3Upload upload = await storageClient .UploadFile (fileName , fileType , cancellationToken );
102102
103- await upload .Upload (stream , cancellationToken ); // загружаем часть документа
104- if (! await upload .Upload (byteArray , cancellationToken )) { // загружаем другую часть документа
103+ await upload .AddParts (stream , cancellationToken ); // загружаем части документа
104+ if (! await upload .AddParts (byteArray , cancellationToken )) { // загружаем другую часть документа
105105 await upload .Abort (cancellationToken ); // отменяем загрузку
106106 }
107107else {
@@ -125,11 +125,21 @@ else {
125125}
126126```
127127
128+ ### Получение файла как Stream
129+
130+ ```csharp
131+ var fileStream = await storageClient .GetFileStream (fileName , cancellationToken );
132+ ```
133+
134+ В случае, если файл не существует, возвратится `Stream .Null `.
135+
128136### Проверка существования файла
129137
130138```csharp
131139bool fileExistsResult = await storageClient .IsFileExists (fileName , cancellationToken );
132- if (fileExistsResult ) Console .WriteLine (" Файл существует" );
140+ if (fileExistsResult ) {
141+ Console .WriteLine (" Файл существует" );
142+ }
133143```
134144
135145### Создание подписанной ссылки на файл
@@ -139,7 +149,9 @@ if (fileExistsResult) Console.WriteLine("Файл существует");
139149
140150```csharp
141151string ? preSignedFileUrl = storageClient .GetFileUrl (fileName , expiration );
142- if (preSignedFileUrl != null ) Console .WriteLine ($" URL получен: {preSignedFileUrl }" );
152+ if (preSignedFileUrl != null ) {
153+ Console .WriteLine ($" URL получен: {preSignedFileUrl }" );
154+ }
143155```
144156
145157Существует не безопасный способ создать ссылку, без проверки наличия файла в S3 .
0 commit comments