Acceso a archivos utilizando Azure Storage Files
¿Storage Files?
Azure Storage Files nos permite aprovechar recursos compartidos que se encuentran en la nube y son totalmente administrados.
Las ventajas de Azure Storage Files son:
- Seguro
- Multiplataforma
- Inteligente
- Muy fácil de administrar
- Creado para ofrecer flexibilidad híbrida
Para realizar está práctica es necesario disponer de una cuenta de Microsoft Azure con fondos, ya que una cuenta de almacenamiento no es gratis.
En este post aprenderemos a:
- Crear una cuenta de almacenamiento donde subiremos los archivos que queramos desde la aplicación MVC.
- La aplicación MVC donde consumiremos los datos que hayamos subido al Azure Storage File.
- Leer la información del fichero tanto si es de formato TXT o XML.
- Tener la posibilidad de eliminar el fichero del Storage File desde la aplicación MVC.
1. Creación de la cuenta de almacenamiento
En el navegador, nos dirigimos al Portal de Azure, donde nos tendremos que conectar con una cuenta que tenga fondos disponibles.
Una vez en la página principal, hacemos clic en crear un nuevo recurso.
En el buscador escribimos «cuenta de almacenamiento», o «storage account» en inglés, y hacemos clic sobre el resultado que nos aparezca.
Elegimos la suscripción que queramos utilizar, y en el grupo de recursos elegimos uno que ya tengamos o, si queremos, creamos uno nuevo. El nombre de la cuenta de almacenamiento tiene que ser único, por lo que es recomendable añadirle tus iniciales al final.
Todas las demás opciones se pueden dejar por defecto. Finalmente, creamos la cuenta de almacenamiento.
Una vez se haya creado, accedemos al recurso y hacemos clic sobre Archivos.
Dentro de Archivos, creamos un nuevo recurso compartido de archivos, no es necesario poner un nombre único, y le agregamos una cuota, con una cuota de 1 GiB es suficiente para realizar este tutorial. Finalmente, creamos el recurso.
En el recurso compartido de archivos, podemos añadir manualmente los archivos, en nuestro caso ya no necesitaríamos realizar nada más.
2. Creación de la aplicación MVC
Nos dirigimos a Visual Studio, y creamos un nuevo proyecto, y elegimos la opción ASP.NET Web Application (.NET Framework).
Escogemos la plantilla Empty, añadimos las referencias de MVC y creamos el proyecto.
Hacemos clic derecho sobre el proyecto, y hacemos clic en Manage NuGet Packages…
Tenemos que agregar dos NuGet que necesitaremos para poder conectarnos a la cuenta de almacenamiento.
- Windows.Azure.Storage
- Microsoft.WindowsAzure.ConfigurationManager
Necesitamos obtener la cadena de acceso de la cuenta de almacenamiento para conectarnos, para obtenerla, en la cuenta de almacenamiento, hacemos clic en Claves de Acceso.
Copiamos la cadena de conexión de key1.
Nos dirigimos al archivo Web.config y añadimos una nueva línea a appSettings.
<add key="storagefileaccount" value="DefaultEndpointsProtocol=https;AccountName=storageaccountbmg;AccountKey=nIpDBXMl4skRkRkogUWekcKwyVbUdcN9foHzppuPc/rWXGdho3ekwGp2+OX0i0SSZNH/OWmAdZWQFu1mydRVbA==;EndpointSuffix=core.windows.net"/>
Debería quedar tal y como aparece en la siguiente imagen:
Vamos a crear los métodos para realizar todas las acciones que necesitamos, para ello, creamos la carpeta Repositories y creamos una nueva clase, en nuestro caso la llamaremos RepositoryStorageFile.
Añadimos los espacios de nombres que necesitamos en la clase:
using Microsoft.Azure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.File;
using System.IO;
using System.Linq;
using System.Xml.Linq;
Declaramos el directorio a nivel de clase, y, en el constructor, instanciamos los objetos para realizar la conexión a la cuenta de almacenamiento.
namespace MvcStorageFileAzure.Repositories
{
public class RepositoryStorageFile
{
CloudFileDirectory root;
public RepositoryStorageFile()
{
String keys = CloudConfigurationManager.GetSetting("storagefileaccount");
CloudStorageAccount account = CloudStorageAccount.Parse(keys);
CloudFileClient client = account.CreateCloudFileClient();
CloudFileShare shared = client.GetShareReference("storagefilesbmg");
this.root = shared.GetRootDirectoryReference();
}
}
}
Creamos el método con el que subiremos los archivos a la cuenta de almacenamiento.
public void UploadFile(String filename, Stream stream)
{
CloudFile file = this.root.GetFileReference(filename);
file.UploadFromStream(stream);
}
Ahora creamos el controlador donde instanciaremos el repositorio que hemos creado. Hacemos clic derecho sobre la carpeta Controllers y creamos un nuevo controlador MVC 5 Controller – Empty.
Añadimos los espacio de nombres necesarios para poder usar Stream y el repositorio.
using System.IO;
using MvcStorageFileAzure.Repositories;
Declaramos el repositorio a nivel de clase y lo instanciamos en el constructor.
RepositoryStorageFile repo;
public StorageFileController()
{
this.repo = new RepositoryStorageFile();
}
Creamos el ActionResult cuya vista será la encargada de subir ficheros.
// GET: UploadFile
public ActionResult UploadFile()
{
return View();
}
// POST: UploadFile
[HttpPost]
public ActionResult UploadFile(HttpPostedFileBase file)
{
Stream stream = file.InputStream;
repo.UploadFile(file.FileName, stream);
ViewBag.Mensaje = "El fichero seleccionado se ha subido a Azure correctamente.";
return View();
}
Creamos la vista, que contará con un formulario que utilizaremos para subir los archivos.
Nos creamos un archivo txt de prueba, para subirlo a la cuenta de almacenamiento.
Finalmente, inicamos la aplicación, subimos el archivo de prueba y comprobamos que se han subido correctamente a la cuenta de almacenamiento.
Vamos a crear un método que nos devuelva una lista de todos los archivos que tenga la cuenta de almacenamiento. En nuestro caso el método se llamará GetStorageFiles().
public List GetStorageFiles()
{
List<string> filenames = new List<string>();
List<IListFileItem> storagefiles = this.root.ListFilesAndDirectories().ToList();
foreach (IListFileItem file in storagefiles)
{
String uri = file.StorageUri.PrimaryUri.ToString();
int last = uri.LastIndexOf('/') + 1;
String filename = uri.Substring(last);
filenames.Add(filename);
}
return filenames;
}
En el controlador, creamos el ActionResult Index, donde obtendremos la lista que nos devuelva el método.
// GET: Index
public ActionResult Index()
{
List<string> files = this.repo.GetStorageFiles();
return View(files);
}
Creamos la vista, donde añadiremos un link que nos lleve a la vista para subir archivos.
Adicionalmente, indicamos que Index sea la vista que se cargue por defecto en el RouteConfig, dentro de la carpeta AppStart.
Iniciamos la aplicación para que nos muestre la lista en la que se debería encontrar el archivo que hemos subido anteriormente.
3. Lectura de la información dependiendo de su tipo
Creamos el método para leer el fichero si es TXT.
public String ReadTxt(String filename)
{
CloudFile file = this.root.GetFileReference(filename);
String filecontent = file.DownloadTextAsync().Result;
return filecontent;
}
En el controlador, creamos el ActionResult, donde tenemos que devolver el texto en un ViewBag, ya que si lo devolvemos en el Model no funciona.
//GET: ReadTxtFile
public ActionResult ReadTxtFile(String filename)
{
String filecontent = this.repo.ReadTxt(filename);
ViewBag.Contenido = filecontent;
return View();
}
Creamos la vista para los archivos TXT, que nos devolverá el texto en un párrafo y añadimos un link para volver a Index.
Iniciamos la aplicación y leemos el archivo que subimos anteriormente.
Para leer un archivo XML, tenemos que tener en cuenta que no podemos leer cualquier archivo XML, porque para poder dibujarlo debemos crear los modelos necesarios para un archivo XML específico.
En nuestro caso utilizaremos este archivo XML.
Creamos los 2 modelos para dibujar el XML en la carpeta Models.
- Motorista.cs
namespace MvcStorageFileAzure.Models
{
public class Motorista
{
public String Nombre { get; set; }
public String Dorsal { get; set; }
public String Titulos { get; set; }
public String Debut { get; set; }
public List Equipo { get; set; }
}
}
- Equipo.cs
namespace MvcStorageFileAzure.Models
{
public class Equipo
{
public String Nombre { get; set; }
public String Imagen { get; set; }
}
}
Creamos el método para poder leer el archivo XML que hemos descargado anteriormente (si estás leyendo esto y no lo has descargado, deberías descargarlo).
public List<Motorista> ReadXmlFile(String filename)
{
CloudFile xmlfile = this.root.GetFileReference(filename);
String datosxml = xmlfile.DownloadText(System.Text.Encoding.UTF8);
XDocument document = XDocument.Parse(datosxml);
var consulta = from datos in document.Descendants("motorista")
select new Motorista
{
Nombre = (string)datos.Element("nombre"),
Dorsal = (string)datos.Element("dorsal"),
Titulos = (string)datos.Element("titulos"),
Debut = (string)datos.Element("debut"),
Equipo = new List<Equipo>(from eq in
datos.Descendants("equipo")
select new Equipo
{
Nombre = eq.Element("nombre").Value,
Imagen = eq.Element("imagen").Value
})
};
return consulta.ToList();
}
Creamos el ActionResult donde leeremos el archivo XML.
public ActionResult ReadXmlFile(String filename)
{
List<Motorista> motoristas = this.repo.ReadXmlFile(filename);
return View(motoristas);
}
Para finalizar, creamos la vista donde leeremos el archivo XML.
Finalmente, iniciamos la aplicación y comprobamos que funciona.
Hacemos clic en Subir Archivo y subimos el archivo XML.
Volvemos al listado, donde nos aparecerá el archivo XML y pulsamos sobre el link Ver Archivo del XML.
4. Eliminación de archivos desde la aplicación MVC
Esta parte es bastante sencilla, solo debemos crear un método para eliminar los archivos y un ActionResult que ejecute la acción y nos redireccione a Index.
Método
public void DeleteFile(String filename)
{
CloudFile file = this.root.GetFileReference(filename);
file.DeleteIfExists();
}
ActionResult
//GET: DeleteFile
public ActionResult DeleteFile(String filename)
{
this.repo.DeleteFile(filename);
return RedirectToAction("Index");
}
En la vista de Index, añadimos un link que nos lleve al ActionResult para eliminar el fichero.
Finalmente, probamos que funciona.
Autor/a: Bryan Moreno Gallardo
Curso: Microsoft MCSA Web Applications + Microsoft MCSD App Builder + Xamarin
Centro: Tajamar
Año académico: 2018-2019