Almacenar ficheros en Azure File Share
¿Qué es Azure File Share?
Azure File Share es un servicio de azure que ofrece recursos compartidos de archivos administrados en la nube.
Os voy a explicar como crear el recurso en el portal de azure y luego como implementarlo en nuestro proyecto.
Portal de Azure
Lo primero que deberemos hacer es crear una cuenta de almacenamiento de azure.
Debemos elegir un grupo de recursos y darle un nombre a la cuenta, las demás opciones las podemos dejar como están por defecto. A continuación, procedemos a validar y crear.
Después, entramos en la cuenta de almacenamiento y seleccionamos File Shares (Recursos compartidos de archivos).
Seleccionamos añadir, y le damos un nombre. La cuota sirve para definir el tamaño máximo de archivos que puede haber en el File Share, y dejamos la opción de transacción optimizada.
Por último, en la cuenta de almacenamiento, vamos a Access Keys (Claves de acceso), y copiamos la cadena de conexión para usarla en nuestro proyecto.
Visual Studio
Lo primero, creamos un proyecto nuevo de ASP.NET Core, en el cuál tendremos que instalar el NuGet Azure.Storage.Files.Shares.
En appsettings.json añadimos la cadena de conexión de la cuenta de almacenamiento.
A continuación, creamos la carpeta Services, y añadimos una clase llamada ServiceFileShare.
Y dentro de la clase, lo primero será hacer un using a Azure.Storage.Files.Shares.
using Azure.Storage.Files.Shares;
La clase debe tener un ShareDirectoryClient y lo inicializamos de la siguiente manera:
«con» es la clave de acceso, y se lo inyectaremos después, desde el Startup, y en «filesharegsr» ponemos el nombre que le hayamos puesto al File Share en azure.
A continuación, hacemos métodos para subir, borrar, leer y recuperar todos los ficheros.
Lo siguiente será inyectar la cadena de conexión de la cuenta de almacenamiento al Service desde el startup.
Por último, creamos el controlador y sus vistas:
- FileShareController
public class FileShareController : Controller
{
ServiceFileShare servicefiles;
public FileShareController(ServiceFileShare servicefiles)
{
this.servicefiles = servicefiles;
}
public async Task<IActionResult> Index(String filename)
{
if (filename != null)
{
String content =
await this.servicefiles.GetFileContentAsync(filename);
ViewData["CONTENT"] = content;
}
List<String> files =await this.servicefiles.GetFilesAsync();
return View(files);
}
public IActionResult UploadFile()
{
return View();
}
[HttpPost]
public async Task<IActionResult> UploadFile(IFormFile file)
{
String filename = file.FileName;
using (var stream = file.OpenReadStream())
{
await this.servicefiles.UploadFileAsync(filename, stream);
}
ViewData["MENSAJE"] = "Archivo subido correctamente";
return View();
}
public async Task<IActionResult> DeleteFile(String filename)
{
await this.servicefiles.DeleteFileAsync(filename);
return RedirectToAction("Index");
}
}
- Vista Index
@model List<String>
<h1>Azure File Share</h1>
<a asp-controller="FileShare"
asp-action="Subir">
Subir archivo
</a>
<ul class="list-group">
@foreach (String nom in Model)
{
<li class="list-group-item">
@nom
<a asp-controller="FileShare" class="btn btn-info"
asp-action="Index"
asp-route-filename="@nom">
Leer
</a>
<a asp-controller="FileShare" class="btn btn-danger"
asp-action="Eliminar"
asp-route-filename="@nom">
Eliminar
</a>
</li>
}
</ul>
<p style="color:blue">@ViewData["TEXTO"]</p>
- Vista Subir
<h1>Upload File Azure</h1>
<a asp-controller="FileShare" asp-action="Index">
Volver
</a>
<form enctype="multipart/form-data" method="post">
<input type="file" name="file"
class="form-control"/>
<button type="submit" class="btn btn-info">
Subir
</button>
</form>
Y quedaría de la siguiente forma:
- Autor: George Francis Shinner Rodríguez
- Curso: Desarrollo Web Full Stack, MultiCloud y Multiplataforma
- Centro: Tajamar
- Año académico: 2020-2021
- Código: GitHub