Problem
How to use Azure Blob storage in ASP.NET Core.
Solution
Create a class library and add NuGet package - WindowsAzure.Storage
Add a class to encapsulate settings,
- public class AzureBlobSetings
- {
- public AzureBlobSetings(string storageAccount,
- string storageKey,
- string containerName)
- {
- if (string.IsNullOrEmpty(storageAccount))
- throw new ArgumentNullException("StorageAccount");
- if (string.IsNullOrEmpty(storageKey))
- throw new ArgumentNullException("StorageKey");
- if (string.IsNullOrEmpty(containerName))
- throw new ArgumentNullException("ContainerName");
- this.StorageAccount = storageAccount;
- this.StorageKey = storageKey;
- this.ContainerName = containerName;
- }
- public string StorageAccount { get; }
- public string StorageKey { get; }
- public string ContainerName { get; }
- }
Add a class to encapsulate a blob item,
- public class AzureBlobItem
- {
- public AzureBlobItem(IListBlobItem item)
- {
- this.Item = item;
- }
- public IListBlobItem Item { get; }
- public bool IsBlockBlob => Item.GetType() == typeof(CloudBlockBlob);
- public bool IsPageBlob => Item.GetType() == typeof(CloudPageBlob);
- public bool IsDirectory => Item.GetType() == typeof(CloudBlobDirectory);
- public string BlobName => IsBlockBlob ? ((CloudBlockBlob)Item).Name :
- IsPageBlob ? ((CloudPageBlob)Item).Name :
- IsDirectory ? ((CloudBlobDirectory)Item).Prefix :
- "";
- public string Folder => BlobName.Contains("/") ?
- BlobName.Substring(0, BlobName.LastIndexOf("/")) : "";
- public string Name => BlobName.Contains("/") ?
- BlobName.Substring(BlobName.LastIndexOf("/") + 1) : BlobName;
- }
- private async Task<CloudBlobContainer> GetContainerAsync()
- {
- //Account
- CloudStorageAccount storageAccount = new CloudStorageAccount(
- new StorageCredentials(settings.StorageAccount, settings.StorageKey), false);
- //Client
- CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
- //Container
- CloudBlobContainer blobContainer =
- blobClient.GetContainerReference(settings.ContainerName);
- await blobContainer.CreateIfNotExistsAsync();
- return blobContainer;
- }
- private async Task<CloudBlockBlob> GetBlockBlobAsync(string blobName)
- {
- //Container
- CloudBlobContainer blobContainer = await GetContainerAsync();
- //Blob
- CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(blobName);
- return blockBlob;
- }
- private async Task<List<AzureBlobItem>> GetBlobListAsync(
- bool useFlatListing = true)
- {
- //Container
- CloudBlobContainer blobContainer = await GetContainerAsync();
- //List
- var list = new List<AzureBlobItem>();
- BlobContinuationToken token = null;
- do
- {
- BlobResultSegment resultSegment =
- await blobContainer.ListBlobsSegmentedAsync("", useFlatListing,
- new BlobListingDetails(), null, token, null, null);
- token = resultSegment.ContinuationToken;
- foreach (IListBlobItem item in resultSegment.Results)
- {
- list.Add(new AzureBlobItem(item));
- }
- } while (token != null);
- return list.OrderBy(i => i.Folder).ThenBy(i => i.Name).ToList();
- }
Ger F VersteegPosted Oct 17, 2017, 11:39 AM
Hello Tahir, nice source but I dont understand "settings" in : //Account CloudStorageAccount storageAccount = new CloudStorageAccount( new StorageCredentials(settings.StorageAccount, settings.StorageKey), false); Please can you help me with a explanation? Best Regards Ger F.