Compartir a través de


Windows Azure Blob

El servicio de Blob de Windows Azure Storage proporciona almacenamiento para entidades binarias o archivos. Sería el almacenamiento adecuado cuando es necesario almacenar archivos de imágenes, sonidos, videos, archivos del tipo que sea, etc... El API de Blob es también un API basada en REST.

El servicio de Blob expone dos entidades fundamentales, contenedores y blobs. Todo blob debe alojarse dentro de un contendor.


Figura 1.- Estructura de los Blobs

Existen dos tipos de blobs:

  • Blobs de bloque (Block Blobs), que están optimizados para streaming.

  • Blobs de página (Page Blobs), que están optimizados para el acceso aleatorio de escritura y lectura en lugares arbitrarios del blob.

Evidentemente en muchas ocasiones es necesario ser capaces de distinguir unos blobs de otros una vez almacenados, por ello los blobs soportan que se asocie metadatos con ellos.

Usando el API del servicio de Blob, los desarrolladores pueden crear una jerarquía de namespaces similar a un sistema de archivos. Los nombre de los Blobs pueden seguir una codificación que use un separador de 'directorios' configurable (típicamente /) de manera que llamar a un Blob Imagenes/MiImagen1 y a otro Sonidos/MiSonido1 implique una organización a nivel lógico de los Blobs almacenados.

El API de Azure Storage va a permitir operaciones de enumeración de tal manera que puedan enumerarse todos los Blobs que se encuentran dentro de la jerarquía Imagenes.

Trabajo con Blobs

Para trabajar con Blobs el primer paso es establecer una conexión con el servicio de almacenamiento. Para realizar esta acción basta con obtener la cadena de conexión del fichero de configuración:

<connectionStrings> 
<add name="DataConnectionString"
connectionString="UseDevelopmentStorage=true"/>
</connectionStrings>

Y abrir una conexión con el siguiente código que usa la clase CloudStorageAccount para desde una cadena de conexión obtener un BlogStorageClient que permitirá luego manipular los Blobs disponibles en Windows Azure Storage:

// Establecer la conexión con Windows Azure 
var storageAccount = CloudStorageAccount.FromConfigurationSetting
("DataConnectionString");
_BlobClient = storageAccount.CreateCloudBlobClient();

Una vez se dispone de un BlobStorageClient, lógicamente será necesario añadir un nuevo contenedor de Blobs. Tarea simple gracias a la clase CloudBlobContainer y su método CreateIfNotExists, tal y como podéis ver en el siguiente código:

 // Obtener el contenedor y clearlo si no existe 
_BlobContainer = _BlobClient.GetContainerReference("fotos");
_BlobContainer.CreateIfNotExist();

Los contenedores de Blobs pueden ser públicos o privados. En este caso se ha creado un contenedor público. Si el contenedor fuese privado, sólo conociendo la clave de nuestro almacenamiento y la cuenta de Azure Storage se podría acceder. Es importante recordar que cualquiera puede acceder a un contenedor público.

Subir el contenido de un Blob al almacenamiento es una tarea sumamente simple. Basta con obtener una referencia al Blob, invocar al método UploadFromStream y establecer las propiedades y metadatos del blob, tal y como puede verse en el siguiente código:

// Ceamos un nombre único para el blob y creamos 
una referencia a ese blob
var blob = _BlobContainer.GetBlobReference(Guid.NewGuid()
.ToString() + Path.GetExtension(FUPhoto.FileName));
//Subimos el archivo al almacenamiento
blob.UploadFromStream(FUPhoto.FileContent);
// Establecemos los metadatos del blog
blob.Metadata["Name"] = TBPhotoName.Text;
blob.Metadata["Author"] = TBAuthor.Text;
blob.SetMetadata();
// Establecemos el tipo de contenido del blob
blob.Properties.ContentType = FUPhoto.PostedFile.ContentType;
blob.SetProperties();

Para enumerar el contenido de un contenedor de Blobs se puede hacer tras obtener una referencia al mismo, y llamar al método ListBlobs. Tras enumerar los Blobs es posible ir accediendo a las propiedades y metadatos de cada uno de ellos, pero para ello primero es necesario llamar a FechtAttributes para forzar la recogida de los metadatos asociados al Blob.

A continuación puede verse estas operaciones en la siguiente porción de código:

// Obtenemos un lista de todos los blobs 
var blobs =_BlobContainer.ListBlobs();
var photos = new List<PhotoMetadata>();
//Para cada Blob que almacena una
foto, obtenemos los metadatos de la foto
//para mostrarlos en un grid.
foreach (var blobItem in blobs)
{
var cloudBlob = _BlobContainer.GetBlobReference
(blobItem.Uri.ToString());
cloudBlob.FetchAttributes();
photos.Add(new PhotoMetadata(blobItem.Uri,
cloudBlob.Metadata["Name"],cloudBlob.Metadata["Author"]));
}

Por último eliminar un Blob es tan simple como llamar al método DeleteIfExist sobre la referencia a un Blob, tal y como puede verse a continuación:

// Obtener la referencia al blob y eliminarlo 
var blob = _BlobContainer.GetBlobReference(blobUri);
blob.DeleteIfExists();