Operaciones de fichero contra un blob en Windows Azure

Operaciones de fichero contra un blob en Windows Azure
Sin comentarios Facebook Twitter Flipboard E-mail

Una de las operaciones más básicas que realizamos en cualquier aplicación son las operaciones con ficheros. Es decir subir, bajar, leer o escribir ficheros (de texto por ejemplo) en una unidad de almacenamiento; sea en local, en red o, como quiero mostrar en este tutorial, en una StorageAccount de Windows Azure.

Pero primero voy a describir por encima como es la estructura en donde voy a guardar mis datos, para entender mejor los conceptos de BlobStorage, Container y Blob.

Cuatro formatos de almacenar datos

Una cuenta de almacenamiento Azure tiene como objetivo y utilidad el guardar información de forma sencilla, pudiendo crecer de forma muy importante – no puedo decir sin límite porque lo hay, aunque sea muy grande – y pudiendo asegurar la disponibilidad que solo el Cloud puede comprometer de forma económica.

A su vez esta cuenta ofrece tres formatos diferentes que se desglosan de la siguiente forma:

  • Blobs en bloques: son una forma escalable y económica de almacenar grandes cantidades de datos de blobs de manera segura. Entre los casos de uso típicos se incluyen el uso compartido de datos, los grandes datos y las copias de seguridad.
  • Blobs en páginas y discos: los blobs en páginas proporcionan almacenamiento en bloque optimizado para el acceso aleatorio y las actualizaciones frecuentes. Debido a su alto rendimiento, durabilidad y confiabilidad, se usan como discos persistentes para las máquinas virtuales en Azure.
  • Tablas y colas: las tablas son bases de datos distintas de SQL escalables a gran escala y extremadamente fáciles de usar. Proporcionan almacenamiento basado en pares de clave-valor para datos estructurados o parcialmente estructurados. Las colas proporcionan un sistema de mensajería confiable que permite implementar la programación de tareas asincrónicas y mensajes persistentes.
    • * La descripción es un copia de lo que publica la propia Azure, que difícilmente lo voy a expresar mejor.

      Existe actualmente un cuarto formato, llamado Archivos, que aún está en modo Preview y que está relacionado con montar un sistema de archivos compartidos para su acceso desde máquinas virtuales mediante el protocolo SMB. Pero que aún no está disponible para el gran público.

      Para este tutorial voy a utilizar el primer almacenamiento, el de blobs en bloques.

      Dando de alta mi primer Container

      El siguiente paso, suponiendo que ya tienes tú cuenta de Azure gratuita o no, es dar de alta un servicio de almacenamiento en donde voy a realizar las operaciones de guardar los ficheros en un blob.

      Así que me voy al panel de Azure y añado una nueva cuenta de almacenamiento, de forma rápida, pulsando en el botón inferior izquierdo del “+” y siguiendo la secuencia que se ve en la imagen a continuación.

      Almacenar fichero en blob  de Azure desde ASP.NET MVC

      En la configuración pongo un nombre descriptivo; como grupo de afinidad el del Norte de Europa que es el que mejor va para España; si tengo más de una suscripción elijo la que más me convenga; y la replicación la escojo como Localmente redundante que no tiene cargo.

      Ya tengo mi suscripción de almacenamiento dada de alta, y toca ahora crear un contenedor para mis blob. Así que entro dentro de la StorageAccount genbetadevstorage y pulso en la pestaña de contenedores.

      Almacenar fichero en blob  de Azure desde ASP.NET MVC

      Aquí le digo que quiero crear un nuevo contenedor, o que lo quiero agregar, y se me abre una mini configuración que solamente me pide el nombre del mismo y el nivel de privacidad del acceso.

      Almacenar fichero en blob  de Azure desde ASP.NET MVC

      Y ya está por ahora. Pero no cierres la ventana de Azure, porque tendremos que volver en un ratito.

      Almacenar fichero en blob  de Azure desde ASP.NET MVC

      Show me the code

      El objetivo de este pequeño programita es mostrar una Web en donde pueda elegir un fichero local y almacenarlo (upload) en un blob de Azure.

      Para ello lo primero – recuerda que soy especialista en tecnología .NET por lo cual mis ejemplos están realizados con Visual Studio (Web Express vale) en C# - es dar de alta un nuevo proyecto del tipo Cloud -> ASP.NET Web.

      Así me aseguro que tengo descargado e instalado la última versión del SDK de Windows Azure que me permite utilizar las librerías de la plataforma.

      Si no fuera así, me va a tocar descargarlo e instalarlo pulsando siguiente, siguiente en el ayudante de instalación; muy al estilo Microsoft.

      Ahora ya puedo dar de alta mi proyecto ASP.NET MVC con capacidad de conectarse a Azure. El cual tiene el esquema clásico de carpetas compuesto por View, Controller y Model.

      Lo primero que hago es quitarme toda la “morralla” de código que por defecto me pone en la página de Index.cshtml, borrando absolutamente todo y dejando solamente lo necesario.

      @{
          ViewBag.Title = "Home Page";
      }
      
      

      FileUpload

      @using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multipart/form-data" })) { }

      Fíjate en que solamente utilizo un Helper en Razor: Html.BeginForm que es el que me enviará los datos al método Upload del controlador Home. Y después implemento un input file estándar de html para la selección del fichero y un botón submit normal y corriente.

      El código principal lo he puesto (mala práctica) en el controlador para simplificar el ejemplo, pero lo ideal es que fuera un método en una clase específica, que pudiera ser reutilizado por todos los controladores.

      Pongo el código entero y luego lo voy desgranando:

      using System.Web.Mvc;
      using Microsoft.WindowsAzure.Storage;
      using Microsoft.WindowsAzure.Storage.Blob;
      using System.Configuration;
      
      namespace Continuos.Controllers
      {
          public class HomeController : Controller
          {
              public ActionResult Index()
              {
                  return View();
              }
      
              public ActionResult About()
              {
                  ViewBag.Message = "Your application description page.";
      
                  return View();
              }
      
              public ActionResult Contact()
              {
                  ViewBag.Message = "Your contact page.";
      
                  return View();
              }
      
              [HttpPost]
              public ActionResult Upload()
              {
                  if (Request.Files.Count > 0)
                  {
                      var file = Request.Files[0];
      
                      if (file != null && file.ContentLength > 0)
                      {
                          CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["StorageConnection"].ConnectionString);
                          CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
                          CloudBlobContainer container = blobClient.GetContainerReference("2013");
                          CloudBlockBlob blockBlob = container.GetBlockBlobReference(file.FileName);
      
                          blockBlob.UploadFromStream(file.InputStream);
                      }
                  }
      
                  return View();
              }
          }
      }
      

      Realmente he dejado todo lo que trae por defecto el fichero HomeController.cs, que es el que se lanza al entrar en la web, y solamente le he añadido una nueva acción llamada Upload.

      Así que lo primero que hago es comprobar si he introducido algún fichero en la vista para ser subido. Si es así me comunico con Azure creando una conexión a la StorageAccount que recupero desde el archivo de configuración web.config.

      if (Request.Files.Count > 0)
                  {
                      var file = Request.Files[0];
      
                      if (file != null && file.ContentLength > 0)
                      {
      CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["StorageConnection"].ConnectionString);
      CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
      

      Y aquí me encuentro con un problema, al añadir una nueva entrada con la cadena de conexión a Azure, tengo que introducir dos datos sobre la cuenta a la que me quiero enchufar.

      De forma sencilla, estos los puedo recuperar de Azure, la forma más rápida de hacerlo, marcando la suscripción de almacenamiento y pulsando en el botón inferior que pone “Administrar claves de acceso”. Así se me abre una ventana en donde tengo el nombre de la cuenta de almacenamiento y la clave primaria que tengo que pegar en la cadena de conexión.

      Datos de conexión a la StorageAccount en Azure

      Fíjate que no estamos introduciendo el nombre del contenedor, porque esto lo haremos dentro de unas pocas líneas.

         
      

      Ahora que ya tengo la conexión realizada – te propongo el reto de hacer la batería de test para este tutorial – creo un cliente del tipo CloudBlobClient e instancio una referencia al contenedor de Blob especificando cuál es por su nombre: “genbetadevblob”.

      CloudBlobContainer container = blobClient.GetContainerReference("genbetadevblob");
      

      El siguiente paso es instanciar otra referencia al propio blob, al cual le voy a llamar con el nombre del fichero que quiero almacenar, logrando así que parezca que estoy utilizando un sistema de ficheros y no uno de contenedores de blobs.

      CloudBlockBlob blockBlob = container.GetBlockBlobReference(file.FileName);
      

      Por último, como era de esperar, hago un Upload del fichero. Aquí solamente señalarte que estoy trabajando en memoria para que sea mucho más eficiente y no tenga que utilizar el disco duro a menos que sea imprescindible. Por eso utilizo File.InputStream y no simplemente File.

      blockBlob.UploadFromStream(file.InputStream);
      

      Si exploras el intellisense en la referencia al blob, verás que hay un montón de operaciones disponibles – muchas de ellas asíncronas - que deberían cubrir la mayoría de las necesidades simples y complejas de gestión de ficheros.

      Por último quiero responder a la pregunta que nos hacemos todos cuando nos enfrentamos por primera vez con Azure: ¿y esto cuanto me cuesta? Y te puedo dar la alegría de que prácticamente no cuesta nada.

      Para el primer Terabyte al mes, me cuesta 0.0179€ cada GB. almacenado. Es decir, que incluyendo el coste del tráfico de bajada (el de subida no se cobra) lo que tengo que pagar a final de mes no llega al euro.

      Y con esto ya tengo una página MVC que me permite subir ficheros a una cuenta de almacenamiento de blobs en Azure.

      Espero que te sea de utilidad.

      En GenbetaDev | Windows Azure

      Imagen | johntrainor

Comentarios cerrados
Inicio