public interface IStorageService
Task<Uri> UploadPublicFileAsync(string containerName, IFormFile file);
Task<Uri> UploadAsync(string containerName, IFormFile file);
Task<Stream> DownloadAsync(string containerName, string fileUrl);
Task DeleteAsync(string containerName, string fileUrl);
Task<string> GetBlobSasUriAsync(string containerName, string fileUrl, DateTimeOffset? expiryTime);
internal class StorageService : IStorageService
private readonly CloudBlobClient _blobClient;
private readonly IConfiguration _configuration;
public StorageService(CloudBlobClient blobClient, IConfiguration configuration)
_blobClient = blobClient;
_configuration = configuration;
public async Task<Uri> UploadPublicFileAsync(string containerName, IFormFile file)
var container = _blobClient.GetContainerReference(containerName);
await container.CreateIfNotExistsAsync();
var permissions = new BlobContainerPermissions
PublicAccess = BlobContainerPublicAccessType.Blob
await container.SetPermissionsAsync(permissions);
var fileName = GetRandomBlobName(file.FileName);
var blockBlob = container.GetBlockBlobReference(fileName);
await blockBlob.UploadFromStreamAsync(file.OpenReadStream());
public async Task<Stream> DownloadAsync(string containerName, string fileUrl)
Stream fileStream = null;
var container = _blobClient.GetContainerReference(containerName);
if (await container.ExistsAsync())
var fileName = GetFileName(fileUrl);
var file = container.GetBlockBlobReference(fileName);
if (await file.ExistsAsync())
var ms = new MemoryStream();
await file.DownloadToStreamAsync(ms);
fileStream = await file.OpenReadAsync();
public async Task DeleteAsync(string containerName, string fileUrl)
var container = _blobClient.GetContainerReference(containerName);
if (await container.ExistsAsync())
var fileName = GetFileName(fileUrl);
var file = container.GetBlockBlobReference(fileName);
await file.DeleteIfExistsAsync();
public async Task<string> GetBlobSasUriAsync(string containerName, string fileUrl, DateTimeOffset? expiryTime)
string sasBlobToken = string.Empty;
var container = _blobClient.GetContainerReference(containerName);
if (await container.ExistsAsync())
var fileName = GetFileName(fileUrl);
var blob = container.GetBlockBlobReference(fileName);
var sharedAccessBlobPolicy = new SharedAccessBlobPolicy()
SharedAccessExpiryTime = expiryTime?? DateTime.UtcNow.AddHours(_configuration.GetValue<Int32>("SharedAccessExpiryHours")),
Permissions = SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Create
sasBlobToken = blob.GetSharedAccessSignature(sharedAccessBlobPolicy);
return fileUrl + sasBlobToken;
private string GetFileName(string fileUrl)
var uri = new Uri(fileUrl);
return Path.GetFileName(uri.LocalPath);
private string GetRandomBlobName(string fileName)
string ext = Path.GetExtension(fileName);
return $"{Guid.NewGuid()}{ext}";
public async Task<Uri> UploadAsync(string containerName, IFormFile file)
var container = _blobClient.GetContainerReference(containerName);
await container.CreateIfNotExistsAsync();
var permissions = new BlobContainerPermissions
PublicAccess = BlobContainerPublicAccessType.Off
await container.SetPermissionsAsync(permissions);
var fileName = GetRandomBlobName(file.FileName);
var blockBlob = container.GetBlockBlobReference(fileName);
await blockBlob.UploadFromStreamAsync(file.OpenReadStream());
public static IServiceCollection AddStorage(this IServiceCollection services, IConfiguration configuration)
services.AddSingleton<CloudBlobClient>(_ =>
return CloudStorageAccount.Parse(configuration["AzureSrorageConnection"]).CreateCloudBlobClient();
services.AddSingleton<IStorageService, StorageService>();