Cómo consultar Blobs en la nube en el almacenamiento de Windows Azure


Estoy usando Microsoft.WindowsAzure.StorageClient para manipular blobs en Azure Storage. He llegado al punto en el que el usuario necesita enumerar los archivos cargados y modificarlos/eliminarlos. Dado que hay muchos archivos en un contenedor, cuál es la mejor manera de consultar a Azure Storage Services para devolver solo los archivos deseados. Además, me gustaría poder devolver solo un número específico de blobs para poder implementar paginación.

Hay un método llamado ListBlobs en el CloudBlobContainer, pero parece que está devolviendo todas las manchas en el contenedor. Eso no funcionará para mí.

Busqué mucho sobre este tema y no pude encontrar nada útil. Este enlace muestra solo lo básico.

--------- EDITAR

Mi respuesta a continuación no recupera los blobs perezosamente, pero recupera todos los blobs en el contenedor y luego filtra el resultado. Actualmente no hay solución para recuperar blobs perezosamente.

Author: Gorgi Rankovski, 2013-01-21

4 answers

Lo que me he dado cuenta sobre Windows Azure blob storage es que es básico. Como en extremadamente desnudos. Debe usarlo solo para almacenar documentos y metadatos asociados y luego recuperar blobs individuales por ID.

Recientemente migré una aplicación de MongoDB a Windows Azure blob storage. Viniendo de MongoDB, esperaba un montón de diferentes formas eficientes de recuperar documentos. Después de migrar, ahora confío en un RDBMS tradicional y ElasticSearch para almacenar información de blob de una manera más buscable.

Es realmente una lástima que Windows Azure blob storage sea tan limitante. Espero ver mucho-capacidades de búsqueda mejoradas en el futuro (por ejemplo, búsqueda por metadatos, propiedad, regex de nombre de blob, etc.) Además, los índices basados en map / reduce serían impresionantes. Microsoft tiene la oportunidad de convertir a muchas personas de otros sistemas de almacenamiento de documentos si hicieron estas cosas.

 17
Author: NathanAldenSr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-02 03:05:00

El método ListBlobs recupera los blobs en ese contenedor lazily. Por lo tanto, puede escribir consultas contra ese método que no se ejecutan hasta que realice un bucle (o materialice objetos con ToList o algún otro método) en la lista.

Las cosas se aclararán con pocos ejemplos. Para aquellos que no saben cómo obtener una referencia a un contenedor en su cuenta de almacenamiento de Azure, recomiendo este tutorial .

Ordenar por última fecha de modificación y tomar la página número 2 (10 blobs por página):

blobContainer.ListBlobs().OfType<CloudBlob>()
         .OrderByDescending(b=>b.Properties.LastModified).Skip(10).Take(10);

Obtener un tipo específico de archivos. Esto funcionará si ha establecido ContentType en el momento de la carga (lo cual recomiendo encarecidamente que haga):

blobContainer.ListBlobs().OfType<CloudBlob>()
         .Where(b=>b.Properties.ContentType.StartsWith("image"));

Get .archivos jpg y ordenarlos por tamaño de archivo, suponiendo que establece los nombres de archivo con sus extensiones:

blobContainer.ListBlobs().OfType<CloudBlob>()
    .Where(b=>b.Name.EndsWith(".jpg")).OrderByDescending(b=>b.Properties.Length);

Por fin, la consulta no se ejecutará hasta que le diga:

var blobs = blobContainer.ListBlobs().OfType<CloudBlob>()
                          .Where(b=>b.Properties.ContentType.StartsWith("image"));

foreach(var b in blobs) //This line will call the service, 
                        //execute the query against it and 
                        //return the desired files
{
   // do something with each file. Variable b is of type CloudBlob
}
 31
Author: Gorgi Rankovski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-23 00:05:30

Para devolver resultados específicos, una posible opción es usar el prefijo blob y/o contenedor para indexar efectivamente lo que está almacenando. Por ejemplo, puede poner un prefijo de fecha y hora a medida que agrega blobs, o puede poner un prefijo de usuario, depende de su caso de uso en cuanto a cómo desea "indexar" sus blobs. A continuación, puede utilizar este prefijo o una parte de él en la llamada ListBlobs[Segmented] para devolver resultados específicos, obviamente, tendría que poner los elementos más generales primero, luego más específicos elementos, por ejemplo:

2016_03_15_10_15_blobname

Esto le permitiría obtener todos los blobs de 2016, o blobs de marzo de 2016, etc. pero no las manchas de marzo en cualquier año sin múltiples llamadas.

La desventaja de esto es que si necesita volver a indexar los blobs, debe eliminarlos y recrearlos con un nuevo nombre.

Para paginación generalmente puede usar el método ListBlobsSegmented que le dará un token de continuación que puede usar para implementar paginación. Dicho esto, no es de mucha utilidad si necesita saltar páginas, ya que solo funciona comenzando desde donde dejó el último conjunto de resultados reales. Una opción con esto es calcular el número de páginas que necesita omitir, obtenerlas y descartarlas, luego obtener la página real que desea. Si usted tiene una gran cantidad de manchas en cada contenedor esto podría ser bastante ineficiente bastante rápidamente....

También podría tener esto como el método fail back, utilizando un enfoque página por página y almacenando el token de continuación si el usuario hace clic de una página a la siguiente secuencialmente O podrías potencialmente cachear nombres de blobs y hacer tu propia paginación a partir de eso.

También puede combinar estos dos enfoques, por ejemplo, filtrar por su "índice" y luego buscar los resultados.

 3
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-15 15:02:16

Azure Data Lake Gen 2 admitirá los datos almacenados en el Data Lake que se buscarán usando USQL. Las API de Blob storage se pueden usar para almacenar y recuperar esos datos.

 0
Author: Jason Steele,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-14 14:47:36