From 1934b576c761dacb1187e7c57aad93a5aebaeda6 Mon Sep 17 00:00:00 2001 From: Sergio Barriel Date: Wed, 5 Mar 2025 15:41:51 +0100 Subject: [PATCH 1/2] adapted to netstandard2.0 --- .../AzureStorageWrapper.cs | 80 ++++++++++++------- .../AzureStorageWrapper.csproj | 3 +- 2 files changed, 50 insertions(+), 33 deletions(-) diff --git a/src/AzureStorageWrapper/AzureStorageWrapper/AzureStorageWrapper.cs b/src/AzureStorageWrapper/AzureStorageWrapper/AzureStorageWrapper.cs index 4a0b021..eafc44a 100644 --- a/src/AzureStorageWrapper/AzureStorageWrapper/AzureStorageWrapper.cs +++ b/src/AzureStorageWrapper/AzureStorageWrapper/AzureStorageWrapper.cs @@ -38,9 +38,13 @@ public async Task UploadBlobAsync(UploadBlob command) await blobClient.UploadAsync(command.GetContent(), overwrite: true); - command.Metadata ??= new Dictionary(); - command.Metadata.TryAdd("_timestamp", $"{DateTime.UtcNow}"); + if (command.Metadata is null) + { + command.Metadata = new Dictionary(); + } + command.Metadata["_timestamp"] = $"{DateTime.UtcNow}"; + var sanitizedDictionary = SanitizeDictionary(command.Metadata); await blobClient.SetMetadataAsync(sanitizedDictionary); @@ -129,11 +133,14 @@ public async Task EnumerateBlobsAsync(EnumerateBlobs co var container = GetContainer(command.Container); var segment = container.GetBlobsAsync().AsPages(command.ContinuationToken, command.Size); - + var enumerator = segment.GetAsyncEnumerator(); + var references = new List(); - await foreach (var page in segment) + while (await enumerator.MoveNextAsync()) { + var page = enumerator.Current; + foreach (var item in page.Values) { var blobReference = await DownloadBlobReferenceAsync(new DownloadBlobReference() @@ -141,10 +148,12 @@ public async Task EnumerateBlobsAsync(EnumerateBlobs co Uri = $"{container.Uri}/{item.Name}", ExpiresIn = _configuration.DefaultSasUriExpiration }); - + references.Add(blobReference); } + await enumerator.DisposeAsync(); + return new BlobReferenceCollection() { References = references, @@ -162,11 +171,14 @@ public async Task EnumerateAllBlobsAsync(EnumerateAllBl var container = GetContainer(command.Container); var segment = container.GetBlobsAsync().AsPages(null, 10); - + var enumerator = segment.GetAsyncEnumerator(); + var references = new List(); - await foreach (var page in segment) + while (await enumerator.MoveNextAsync()) { + var page = enumerator.Current; + foreach (var item in page.Values) { var blobReference = await DownloadBlobReferenceAsync(new DownloadBlobReference() @@ -174,16 +186,20 @@ public async Task EnumerateAllBlobsAsync(EnumerateAllBl Uri = $"{container.Uri}/{item.Name}", ExpiresIn = _configuration.DefaultSasUriExpiration }); - + references.Add(blobReference); } + + await enumerator.DisposeAsync(); + + return new BlobReferenceCollection() + { + References = references, + ContinuationToken = page.ContinuationToken + }; } - return new BlobReferenceCollection() - { - References = references, - ContinuationToken = null - }; + return null; } private BlobContainerClient GetContainer(string containerName) @@ -207,25 +223,27 @@ private async Task CreateContainerIfNotExists(string containerName) public async Task DownloadBlobAsync(DownloadBlob command) { command.Validate(); - - using var httpClient = new HttpClient(); - - var response = await httpClient.GetAsync(command.Uri); - if (!response.IsSuccessStatusCode) + using (var httpClient = new HttpClient()) { - var fileName = _uriService.GetFileName(command.Uri); - var fileExtension = _uriService.GetFileExtension(command.Uri); + var response = await httpClient.GetAsync(command.Uri); + + if (!response.IsSuccessStatusCode) + { + var fileName = _uriService.GetFileName(command.Uri); + var fileExtension = _uriService.GetFileExtension(command.Uri); + + throw new AzureStorageWrapperException( + $"something went wrong when downloading blob {fileName}.{fileExtension}: {response.ReasonPhrase}"); + } + + var stream = await response.Content.ReadAsStreamAsync(); - throw new AzureStorageWrapperException($"something went wrong when downloading blob {fileName}.{fileExtension}: {response.ReasonPhrase}"); + return new Blob() + { + Stream = stream + }; } - - var stream = await response.Content.ReadAsStreamAsync(); - - return new Blob() - { - Stream = stream - }; } private async Task GetSasUriAsync(GetSasUri command) @@ -259,7 +277,7 @@ private static Dictionary SanitizeDictionary(Dictionary SanitizeKey(item.Key), item => SanitizeValue(item.Value)); - static string SanitizeKey(string key) + string SanitizeKey(string key) { key = RemoveDiacritics(key); @@ -268,14 +286,14 @@ static string SanitizeKey(string key) return key; } - static string SanitizeValue(string @value) + string SanitizeValue(string @value) { value = RemoveDiacritics(value); return value; } - static string RemoveDiacritics(string fileName) + string RemoveDiacritics(string fileName) { var normalizedString = fileName.Normalize(NormalizationForm.FormD); diff --git a/src/AzureStorageWrapper/AzureStorageWrapper/AzureStorageWrapper.csproj b/src/AzureStorageWrapper/AzureStorageWrapper/AzureStorageWrapper.csproj index 391d534..f562956 100644 --- a/src/AzureStorageWrapper/AzureStorageWrapper/AzureStorageWrapper.csproj +++ b/src/AzureStorageWrapper/AzureStorageWrapper/AzureStorageWrapper.csproj @@ -1,8 +1,7 @@  - netstandard2.1 - enable + netstandard2.0;netstandard2.1 2.3.1 AzureStorageWrapper Sergio Barriel From add5c5d4a3a1cae6099b8fac96abaf46850cfcab Mon Sep 17 00:00:00 2001 From: Sergio Barriel Date: Wed, 5 Mar 2025 15:44:53 +0100 Subject: [PATCH 2/2] Upgrade to version 2.4.0 --- .../AzureStorageWrapper/AzureStorageWrapper.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AzureStorageWrapper/AzureStorageWrapper/AzureStorageWrapper.csproj b/src/AzureStorageWrapper/AzureStorageWrapper/AzureStorageWrapper.csproj index f562956..e468630 100644 --- a/src/AzureStorageWrapper/AzureStorageWrapper/AzureStorageWrapper.csproj +++ b/src/AzureStorageWrapper/AzureStorageWrapper/AzureStorageWrapper.csproj @@ -2,7 +2,7 @@ netstandard2.0;netstandard2.1 - 2.3.1 + 2.4.0 AzureStorageWrapper Sergio Barriel Wrapper for Azure Storage, designed to simplify the file upload process and provide links for downloading them. It also supports file deletion and enumeration.