This article is for those who are trying to get a hands-on experience of Azure. Today, we can see media files everywhere, such as images, videos, audio, etc. In order to store them on the cloud securely, we can use Azure Blob Storage.
You need an Azur account for the purpose. If you have one, you may log in here and if you don’t have an Azure account, you can sign up for a 30-day free trial.
Once logged in, go to the dashboard and click on “Storage Account”. After that Add Storage Account in Azure Portal.
Now, our Azure part is done. We will go to our Visual Studio and click on “New Project” and select “Web Application in ASP.NET Core”.
Once our project is created, we need to add some Azure packages from NuGet in order to contact with Azure(WindowsAzure.Storage).
Add a class to encapsulate settings as follows:
public class AzureBlobSetings
{ public AzureBlobSetings(string storageAccount,string storageKey,string containerName) {
if (string.IsNullOrEmpty(storageKey)) throw new ArgumentNullException(“StorageKey”);public class AzureBlobSetings { public AzureBlobSetings(string storageAccount, string storageKey, string containerName) { if (string.IsNullOrEmpty(storageAccount)) throw new ArgumentNullException(“StorageAccount”);
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 as follows:
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; }
Add a class to encapsulate storage access and also add a private helper method to access the storage as mentioned below:
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(); }
Now add public methods to upload and download blob items as follows:
public async Task UploadAsync(string blobName, string filePath) { //Blob CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName);
//Upload using (var fileStream = System.IO.File.Open(filePath, FileMode.Open)) { fileStream.Position = 0; await blockBlob.UploadFromStreamAsync(fileStream); } } public async Task UploadAsync(string blobName, Stream stream) { //Blob CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName); //Upload stream.Position = 0; await blockBlob.UploadFromStreamAsync(stream); } public async Task<MemoryStream> DownloadAsync(string blobName) { //Blob CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName); //Download using (var stream = new MemoryStream()) { await blockBlob.DownloadToStreamAsync(stream); return stream; } } public async Task DownloadAsync(string blobName, string path) { //Blob CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName); //Download await blockBlob.DownloadToFileAsync(path, FileMode.Create); }
Add methods to get a list of blob items as follows:
public async Task<List<AzureBlobItem>> ListAsync()
{ return await GetBlobListAsync(); } public async Task<List<string>> ListFoldersAsync() { var list = await GetBlobListAsync(); return list.Where(i => !string.IsNullOrEmpty(i.Folder)) .Select(i => i.Folder) .Distinct() .OrderBy(i => i) .ToList(); }
Inject and use storage helper as follows:
public class HomeController: Controller
private readonly IAzureBlobStorage blobStorage;
public HomeController(IAzureBlobStorage blobStorage)
{
this.blobStorage = blobStorage;
}
}
Found the article useful? Share it with your friends and co-workers… Now!
If you have any queries or doubts about this topic please feel free to contact us. We are here to help you!