diff --git a/src/AspNetCore.Utilities.CloudStorage.Tests/AspNetCore.Utilities.CloudStorage.Tests.csproj b/src/AspNetCore.Utilities.CloudStorage.Tests/AspNetCore.Utilities.CloudStorage.Tests.csproj index 8863c86..e716f7e 100644 --- a/src/AspNetCore.Utilities.CloudStorage.Tests/AspNetCore.Utilities.CloudStorage.Tests.csproj +++ b/src/AspNetCore.Utilities.CloudStorage.Tests/AspNetCore.Utilities.CloudStorage.Tests.csproj @@ -15,14 +15,14 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/AspNetCore.Utilities.CloudStorage/AspNetCore.Utilities.CloudStorage.csproj b/src/AspNetCore.Utilities.CloudStorage/AspNetCore.Utilities.CloudStorage.csproj index ad35ef0..8e157fd 100644 --- a/src/AspNetCore.Utilities.CloudStorage/AspNetCore.Utilities.CloudStorage.csproj +++ b/src/AspNetCore.Utilities.CloudStorage/AspNetCore.Utilities.CloudStorage.csproj @@ -37,9 +37,9 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/AspNetCore.Utilities.CloudStorage/AzureCloudStorageProvider.cs b/src/AspNetCore.Utilities.CloudStorage/AzureCloudStorageProvider.cs index f238bd2..25053df 100644 --- a/src/AspNetCore.Utilities.CloudStorage/AzureCloudStorageProvider.cs +++ b/src/AspNetCore.Utilities.CloudStorage/AzureCloudStorageProvider.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Threading.Tasks; using Azure.Storage.Blobs; @@ -94,6 +95,17 @@ public interface IAzureCloudStorageProvider /// Task> ListBlobs(string container); + /// + /// Allows checking to see if a blog exists in the provided container based on the full object URL + /// + /// + /// Behind the scenes this utilizes the ExistsAsync method of the BlobClient, which will return true if the blob exists or false if it does not. + /// + /// The container that this was expected in + /// + /// + Task BlobExists(string expectedContainer, string fullObjectUrl); + /// /// Creates a SAS token to access an object with the default duration /// @@ -342,6 +354,21 @@ public async Task> ListBlobs(string container) return blobList; } + [ExcludeFromCodeCoverage(Justification = "Would require integration test to fully validate given direct calls to Azure Blob Storage")] + /// + public async Task BlobExists(string expectedContainer, string fullObjectUrl) + { + var objectName = GetObjectName(expectedContainer, fullObjectUrl); + if (objectName == null) + { + return false; + } + var blobClient = new BlobServiceClient(_storageOptions.Value.StorageConnectionString); + var containerClient = blobClient.GetBlobContainerClient(expectedContainer.ToLower()); + var itemClient = containerClient.GetBlobClient(objectName); + return await itemClient.ExistsAsync(); + } + /// public string CreateSASUrl(string fullObjectPath) {