Trabajando con los blobs de Windows Azure Storage

La palabra Blob se corresponde con las siglas de Binary Large OBject y tiene como objetivo el almacenamiento de archivos de gran tamaño, como por ejemplo:

Cada archivo corresponde a un blob y cada blob está contenido a su vez en un container. Para que os hagáis una idea, un ejemplo podría ser el siguiente: Tengo una cuenta de storage,  a la que puse por nombre MediaStorage, donde quiero almacenar mis archivos de música. A su vez, me gustaría tener un container para separar mis archivos por género pop y rock.

Visto esto, podemos decir que un container se trata de una especie de carpeta, la cual agrupa nuestros blobs.

En este post voy a centrarme en un wrapper disponible a través del SDK de Windows Azure para encapsular las llamadas REST necesarias para cada una de las opciones.
Necesitaremos importar Microsoft.Windows.Azure y Microsoft.Windows.Azure.StorageClient.

¿Tengo entorno de desarrollo?

Si :D A día de hoy se llama Storage Emulator y podemos trabajar con blobs, tablas y colas.

¿Dónde puedo encontrar los archivos almacenados en desarrollo?

La forma más sencilla es a través de Visual Studio 2010. En la ventana Server Explorer podemos ver los archivos almacenados en cada uno de los containers.

Al igual que podemos visualizar nuestro entorno de desarrollo, podríamos adjuntar una cuenta de Storage en la nube y ver su contenido.

¿Cómo conecto con mi cuenta de Storage?

Mientras estamos creando la aplicación, podemos utilizar el entorno de desarrollo local para realizar las pruebas necesarias. El código sería el siguiente:

CloudStorageAccount _account = CloudStorageAccount.DevelopmentStorageAccount;
CloudBlobClient _blobClient = new CloudBlobClient(_account.BlobEndpoint, _account.Credentials);

Una vez finalizado el desarrollo, sería necesario modificar la primera línea para recuperar los valores del archivo de configuración.

CloudStorageAccount.SetConfigurationSettingPublisher((configName,configSetter) => configSetter(RoleEnviroment.GetConfigurationSettingValue(configName)));
CloudStorageAccount _account = CloudStorageAccount.FromConfigurationSetting("StorageAccount");
CloudBlobClient _blobClient = new CloudBlobClient(_account.BlobEndpoint, _account.Credentials);

Un ejemplo de cadena de conexión válida podría ser el siguiente:

<Setting name="StorageAccount" value="DefaultEndpointsProtocol=http;AccountName=returngis;
AccountKey=KoJ9maUaV29LD .... +4D1PJVpAUVOdb2ehHw5nN21XI2KF7Q==" />

Creación de un container

Lo primero que debemos crear es un contenedor donde almacenar nuestros blobs ya que estos últimos no pueden ser creados si no están dentro de alguno.

private CloudBlobContainer GetContainer(string containerName)
{
    var cloudBlobContainer = _blobClient.GetContainerReference(containerName);
    if (cloudBlobContainer.CreateIfNotExist())
    {
         var blobContainerPermissions = cloudBlobContainer.GetPermissions();

         blobContainerPermissions.PublicAccess = BlobContainerPublicAccessType.Container;
         cloudBlobContainer.SetPermissions(blobContainerPermissions);
    }

    return cloudBlobContainer;
}

Con el método CreateIfNotExist nos aseguramos de que el mismo sea generado si no fue creado con anterioridad. Si es la primera vez , este método devolverá true y le asignaremos los permisos para que un usuario anónimo pueda acceder al contenido.

Creación de un blob

Para la creación de un blob, únicamente debemos recuperar el container donde queremos que se aloje y “simular” su recuperación a través de GetBlobReference. Llegados a este punto se creará un nuevo objeto del tipo CloudBlob a través del cual podremos subir un nuevo archivo a la nube.

public void SaveBlob(Stream file, string filename)
{
    var blob = GetContainer("myContainer").GetBlobReference(filename);

    blob.UploadFromStream(file);
}

En este caso he utilizado el método UploadFromStream pero es importante saber que tenemos otros métodos para realizar la subida de archivos:

  • UploadByteArray
  • UploadFile
  • UploadFromStream
  • UploadText

Eliminar un blob

Para eliminar un blob debemos, en primer lugar, recuperar el contenedor (he utilizado el método anterior para ello), recuperar el blob y finalmente llamar al método Delete del mismo.

public void Delete(string uri, string containerName)
{
     var container = GetContainer(containerName);
     var blob = container.GetBlobReference(uri);
     blob.Delete();
}

Crear una copia de un blob

public void Copy(string uri, string containerName)
{
    var container = GetContainer(containerName);
    var blob = container.GetBlobReference(uri);
    var newBlob = container.GetBlobReference(string.Format("Copy of {0}", blob.Uri.Segments[blob.Uri.Segments.Length - 1]));

    newBlob.CopyFromBlob(blob);
}

Crear un snapshot de un blob

public void Snapshot(string uri, string containerName)
{
     var container = GetContainer(containerName);
     var blob = container.GetBlobReference(uri);
     blob.CreateSnapshot();
}

¿Qué diferencia hay entre una copia y un snapshot?

Los snapshots proporcionan una versión sólo de lectura de un blob. Esta funcionalidad puede ser útil para restaurar una versión anterior de un blob después de ser modificado. Sin embargo, una copia  es un blob distinto ,creado a partir de otro, el cual se puede modificar.

Añadir metadatos

public void AddMetadata(string uri, string containerName)
{
     var container = GetContainer(containerName);
     var blob = container.GetBlobReference(uri);

     var metadata = new NameValueCollection();
     metadata["Language"] = "es";
     metadata["Date"] = DateTime.Now.ToShortTimeString();

     blob.Metadata.Add(metadata);
}

Espero que sea de utilidad :)

¡Saludos!

8 comentarios sobre “Trabajando con los blobs de Windows Azure Storage

  1. Compartido por Trabajando con las queues de Windows Azure Storage | Return(GiS);

  2. Mi aporte…

    Creo, actualizo, elimino, le agrego meta información, “snapsheo”… pero … como descargo??

    ●DownloadBlobToFile

    CloudBlob cc = _blobClient.GetBlobReference(“mycontainer/myblob.txt”);
    cc.DownloadToFile(“c:mylocalblob.txt”);

    ●GetByteArrayBlob

    CloudBlob blob = _blobClient.GetBlobReference(“mycontainer/myblob.txt”);
    Byte[] blobBytes = blob.DownloadByteArray();
    return blobBytes;

    ● AppendTextBlobToFile

    CloudBlob blob = _blobClient.GetBlobReference(“mycontainer/myblob.txt”);
    FileStream stream = new FileStream(“C:appendtofile.txt”, FileMode.Append);
    blob.DownloadToStream(stream);

    Ô_o

  3. Excelente articulo, pero tengo una gran duda. Como hago desde Visual Basic la parte de:

    CloudStorageAccount.SetConfigurationSettingPublisher((configName,configSetter) => configSetter(RoleEnviroment.GetConfigurationSettingValue(configName)));
    CloudStorageAccount _account = CloudStorageAccount.FromConfigurationSetting(“StorageAccount”);
    CloudBlobClient _blobClient = new CloudBlobClient(_account.BlobEndpoint, _account.Credentials);[/csharp]

    NO he podido hacer la conversion de esta linea de codigo a VB.

    Muchas gracias

Deja un comentario