¿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.

https://flic.kr/p/2e1kWPD

En el buscador escribimos «cuenta de almacenamiento», o «storage account» en inglés, y hacemos clic sobre el resultado que nos aparezca.

https://flic.kr/p/24MFoj6

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.

https://flic.kr/p/2fpezZK

Una vez se haya creado, accedemos al recurso y hacemos clic sobre Archivos.

https://flic.kr/p/2fpfsCt

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.

https://flic.kr/p/2fjA82q

En el recurso compartido de archivos, podemos añadir manualmente los archivos, en nuestro caso ya no necesitaríamos realizar nada más.

https://flic.kr/p/2fpfyPM

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).

https://flic.kr/p/TfYYQ7

Escogemos la plantilla Empty, añadimos las referencias de MVC y creamos el proyecto.

https://flic.kr/p/TfYYPf

Hacemos clic derecho sobre el proyecto, y hacemos clic en Manage NuGet Packages…

https://flic.kr/p/TfYYVh

Tenemos que agregar dos NuGet que necesitaremos para poder conectarnos a la cuenta de almacenamiento.

  • Windows.Azure.Storage
https://flic.kr/p/RCPoqX
  • Microsoft.WindowsAzure.ConfigurationManager
https://flic.kr/p/RCPoqX

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.

https://flic.kr/p/2fjE4cd

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:

https://flic.kr/p/2e1qcCi

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.

https://flic.kr/p/2e1qctF

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();
}
}
}
https://flic.kr/p/2eimD6Y

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);
}
https://flic.kr/p/2fjE4fE

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.

https://flic.kr/p/2e1qcEH
https://flic.kr/p/2e1qczH

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();
}
https://flic.kr/p/2e1qczx

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();
}
https://flic.kr/p/2fjE4eY

Creamos la vista, que contará con un formulario que utilizaremos para subir los archivos.

https://flic.kr/p/2fjE4gb

Nos creamos un archivo txt de prueba, para subirlo a la cuenta de almacenamiento.

https://flic.kr/p/2ein98A

Finalmente, inicamos la aplicación, subimos el archivo de prueba y comprobamos que se han subido correctamente a la cuenta de almacenamiento.

https://flic.kr/p/Tg51rU
https://flic.kr/p/24MLfpD

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;
}
https://flic.kr/p/24MLfp8

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);
}
https://flic.kr/p/24MLfo6

Creamos la vista, donde añadiremos un link que nos lleve a la vista para subir archivos.

https://flic.kr/p/2ein9kQ

Adicionalmente, indicamos que Index sea la vista que se cargue por defecto en el RouteConfig, dentro de la carpeta AppStart.

https://flic.kr/p/2ein9ku

Iniciamos la aplicación para que nos muestre la lista en la que se debería encontrar el archivo que hemos subido anteriormente.

https://flic.kr/p/2ein9jN

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;
}
https://flic.kr/p/Thcnbu

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();
}
https://flic.kr/p/RE2hsz

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.

https://flic.kr/p/RE2hs4

Iniciamos la aplicación y leemos el archivo que subimos anteriormente.

https://flic.kr/p/ThcnbQ
https://flic.kr/p/RE2hrx

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; }
}
}
https://flic.kr/p/24NSsVx
  • Equipo.cs
namespace MvcStorageFileAzure.Models
{
public class Equipo
{
public String Nombre { get; set; }
public String Imagen { get; set; }
}
}
https://flic.kr/p/2ejtRCG

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();
    }
https://flic.kr/p/24NSsV2

Creamos el ActionResult donde leeremos el archivo XML.

public ActionResult ReadXmlFile(String filename)
{
List<Motorista> motoristas = this.repo.ReadXmlFile(filename);
return View(motoristas);
}
https://flic.kr/p/2ejtRBu

Para finalizar, creamos la vista donde leeremos el archivo XML.

https://flic.kr/p/2e2xA1z

Finalmente, iniciamos la aplicación y comprobamos que funciona.

https://flic.kr/p/ThcnbQ

Hacemos clic en Subir Archivo y subimos el archivo XML.

https://flic.kr/p/2ejtRB9

Volvemos al listado, donde nos aparecerá el archivo XML y pulsamos sobre el link Ver Archivo del XML.

https://flic.kr/p/2ejtREf
https://flic.kr/p/24NSsVT

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();
}
https://flic.kr/p/2ejtRHG

ActionResult

//GET: DeleteFile
public ActionResult DeleteFile(String filename)
{
this.repo.DeleteFile(filename);
return RedirectToAction("Index");
}
https://flic.kr/p/2ejtRJ3

En la vista de Index, añadimos un link que nos lleve al ActionResult para eliminar el fichero.

Finalmente, probamos que funciona.

https://flic.kr/p/2ejtREf
https://flic.kr/p/ThcnbQ

Autor/a: Bryan Moreno Gallardo

Curso: Microsoft MCSA Web Applications + Microsoft MCSD App Builder + Xamarin

Centro: Tajamar

Año académico: 2018-2019

Otros datos de interés: LinkedIn | GitHub

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.