In this article, we are going to discuss the introduction of azure file share and step-by-step implementation using .NET Core 6 Web API.
Agenda
	- Introduction
- Benefits
- Azure File Share Configuration
- Step-by-step implementation of File share storage using .NET Core 6 Web API
Prerequisites
	- Visual Studio 2022
- .NET Core 6
- Azure Account
Introduction
	- Azure file share is used to deploy and mounted concurrently by cloud or on-premises deployments.
- Azure file share offers storage on the cloud using standard SMB protocol.
![Azure File Share Storage implementation using .NET Core 6 Web API]()
	- The Server Message Block (SMB) is the network file share protocol that helps us to read and write files.
- File share can be accessed from Windows, Linux, and macOS.
- NFS File share is accessible from Linux or macOS.
Benefits
	- Easy to configure and manage
- Shared access between multiple VMs and Server Machine
- Easy to use and managed by Azure CLI and Cmdlets
Azure File Share Configuration
Step 1
Open the Azure portal
Step 2
Search storage account and create the same.
Step 3
Open the storage account and click on “File Shares” and create a new file share.
![Azure File Share Storage implementation using .NET Core 6 Web API]()
![Azure File Share Storage implementation using .NET Core 6 Web API]()
Step 4
Here we can see the file share which we created earlier and all the files which we are going to upload we can find over here.
![Azure File Share Storage implementation using .NET Core 6 Web API]()
Step 5
Also, open the access keys section in the storage account and copy and save the connection string which we use inside our web application.
![Azure File Share Storage implementation using .NET Core 6 Web API]()
Step-by-step implementation of File share storage using .NET Core 6 Web API
Step 1
Create a new Web API project.
![Azure File Share Storage implementation using .NET Core 6 Web API]()
Step 2
Configure a new project.
![Azure File Share Storage implementation using .NET Core 6 Web API]()
Step 3
Provide additional information.
![Azure File Share Storage implementation using .NET Core 6 Web API]()
Step 4
Install the following NuGet Packages.
![Azure File Share Storage implementation using .NET Core 6 Web API]()
Step 5
Project Structure.
![Azure File Share Storage implementation using .NET Core 6 Web API]()
Step 6
Create a File Details class.
namespace AzureFileShareDemo
{
    public class FileDetails
    {
        public IFormFile FileDetail { get; set; }
    }
}
Step 7
Next, create IFileShare and FileShare inside repositories.
IFileShare.cs
namespace AzureFileShareDemo.Repositories
{
    public interface IFileShare
    {
        Task FileUploadAsync(FileDetails fileDetails);
        Task FileDownloadAsync(string fileShareName);
    }
}
FileShare.cs
using Azure;
using Azure.Storage.Files.Shares;
using Azure.Storage.Files.Shares.Models;
namespace AzureFileShareDemo.Repositories
{
    public class FileShare : IFileShare
    {
        private readonly IConfiguration _config;
        public FileShare(IConfiguration config)
        {
            _config = config;
        }
        public async Task FileUploadAsync(FileDetails fileDetails)
        {
            // Get the configurations and create share object
            ShareClient share = new ShareClient(_config.GetConnectionString("default"), _config.GetValue<string>("FileShareDetails:FileShareName"));
            // Create the share if it doesn't already exist
            await share.CreateIfNotExistsAsync();
            // Check the file share is present or not
            if (await share.ExistsAsync())
            {
                // Get a reference to the sample directory
                ShareDirectoryClient directory = share.GetDirectoryClient("FileShareDemoFiles");
                // Create the directory if it doesn't already exist
                await directory.CreateIfNotExistsAsync();
                // Ensure that the directory exists
                if (await directory.ExistsAsync())
                {
                    // Get a reference to a file and upload it
                    ShareFileClient file = directory.GetFileClient(fileDetails.FileDetail.FileName);
                    // Check path
                    var filesPath = Directory.GetCurrentDirectory() + "/files";
                    var fileName = Path.GetFileName(fileDetails.FileDetail.FileName);
                    var filePath = Path.Combine(filesPath, fileName);
                    using (FileStream stream = File.OpenRead(filePath))
                    {
                        file.Create(stream.Length);
                        file.UploadRange(
                            new HttpRange(0, stream.Length),
                            stream);
                    }
                }
            }
            else
            {
                Console.WriteLine($"File is not upload successfully");
            }
        }
        public async Task FileDownloadAsync(string fileShareName)
        {
            ShareClient share = new ShareClient(_config.GetConnectionString("default"), _config.GetValue<string>("FileShareDetails:FileShareName"));
            ShareDirectoryClient directory = share.GetDirectoryClient("FileShareDemoFiles");
            ShareFileClient file = directory.GetFileClient(fileShareName);
            // Check path
            var filesPath = Directory.GetCurrentDirectory() + "/files";
            if (!System.IO.Directory.Exists(filesPath))
            {
                Directory.CreateDirectory(filesPath);
            }
            var fileName = Path.GetFileName(fileShareName);
            var filePath = Path.Combine(filesPath, fileName);
            // Download the file
            ShareFileDownloadInfo download = file.Download();
            using (FileStream stream = File.OpenWrite(filePath))
            {
                await download.Content.CopyToAsync(stream);
            }
        }
    }
}
Step 8
Add the file share name and connection string inside the appsettings.json file.
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "FileShareDetails": {
    "FileShareName": "jdlearningfileshare"
  },
  "ConnectionStrings": {
    "default": ""
  }
}
Step 9
Register a service inside the Program class.
using AzureFileShareDemo.Repositories;
using FileShare = AzureFileShareDemo.Repositories.FileShare;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddScoped < IFileShare, FileShare > ();
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment()) {
    app.UseSwagger();
    app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Step 10
Next, create a new File Controller.
using AzureFileShareDemo.Repositories;
using Microsoft.AspNetCore.Mvc;
namespace AzureFileShareDemo.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class FilesController : ControllerBase
    {
        private readonly IFileShare fileShare;
        public FilesController(IFileShare fileShare)
        {
            this.fileShare = fileShare;
        }
        /// <summary>
        /// upload file
        /// </summary>
        /// <param name="fileDetail"></param>
        /// <returns></returns>
        [HttpPost("Upload")]
        public async Task<IActionResult> UploadFile([FromForm] FileDetails fileDetail)
        {
            if (fileDetail.FileDetail != null)
            {
                await fileShare.FileUploadAsync(fileDetail);
            }
            return Ok();
        }
        /// <summary>
        /// download file
        /// </summary>
        /// <param name="fileDetail"></param>
        /// <returns></returns>
        [HttpPost("Download")]
        public async Task<IActionResult> DownloadFile(string fileName)
        {
            if (fileName != null)
            {
                await fileShare.FileDownloadAsync(fileName);
            }
            return Ok();
        }
    }
}
Step 11
Finally, run the project and use API endpoints using Swagger UI.
![Azure File Share Storage implementation using .NET Core 6 Web API]()
Step 11
Upload a few files using Swagger UI
![Azure File Share Storage implementation using .NET Core 6 Web API]()
Step 12
Next, open the azure file share, and inside that, you can find the files that we uploaded.
![]()
![Azure File Share Storage implementation using .NET Core 6 Web API]()
This is all about an azure file share.
GitHub Link
https://github.com/Jaydeep-007/AzureFileShareDemo
Conclusion
Here we discussed the basics of azure file share and the file upload and download functionality by using .NET Core Web API.
Happy Learning!