from example .net linq lazy-loading azure-storage-blobs azure-sdk-.net

.net - example - download file from azure blob storage c#



Cómo consultar Cloud Blobs en el almacenamiento de Windows Azure (4)

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

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

Busqué mucho sobre este tema y no pude encontrar nada útil. Este link 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 una solución para recuperar blobs perezosamente.


Azure Data Lake Gen 2 admitirá los datos almacenados en Data Lake para su búsqueda mediante USQL. Las API de almacenamiento de blobs pueden utilizarse para almacenar y recuperar esos datos.


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

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

Ordene por fecha de última modificación y tome la página número 2 (10 manchas por página):

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

Obtener el tipo específico de archivos. Esto funcionará si ha configurado ContentType en el momento de la carga (que le recomiendo que haga):

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

Obtenga archivos .jpg y ordénelos por tamaño de archivo, asumiendo 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 que:

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 }


Lo que me he dado cuenta sobre el almacenamiento de blob de Windows Azure es que es escueto. Como en extremadamente escueto. Debe usarlo solo para almacenar documentos y metadatos asociados y luego recuperar los blobs individuales por ID.

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

Es realmente muy malo que el almacenamiento de blob de Windows Azure sea tan limitado. Espero ver capacidades de búsqueda mejoradas en el futuro (por ejemplo, búsqueda por metadatos, propiedad, expresión de nombre de blob, etc.) Además, los índices basados ​​en mapa / reducir serían impresionantes. Microsoft tiene la oportunidad de convertir a muchas personas de otros sistemas de almacenamiento de documentos si hacen estas cosas.


Para obtener resultados específicos, una opción posible es usar el prefijo blob y / o contenedor para indexar efectivamente lo que está almacenando. Por ejemplo, puede prefijar una fecha y hora a medida que agrega blobs, o puede prefijar a un usuario, dependiendo de su caso de uso en cuanto a cómo desea "indexar" sus blobs. Luego, puede usar este prefijo o una parte de él en la llamada de ListBlobs [Segmentado] para obtener resultados específicos, obviamente necesitará poner primero los elementos más generales, luego los elementos más específicos, 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 blobs de marzo en cualquier año sin llamadas múltiples.

El inconveniente de esto es que si necesitas volver a indexar las manchas, deberías eliminarlas y recrearlas con un nuevo nombre.

En general, para la paginación puede usar el método ListBlobsSegmented que le dará un token de continuación que puede usar para implementar la paginación. Dicho esto, no es de mucha utilidad si necesita omitir páginas, ya que solo funciona al comenzar desde donde se dejó el último conjunto de resultados reales. Una opción con esto es calcular la cantidad de páginas que necesita omitir, obtenerlas y descartarlas, luego obtener la página real que desea. Si tiene muchas manchas en cada contenedor, esto podría volverse bastante ineficiente bastante rápido ...

También puede tener esto como método de recuperación, utilizando un enfoque página por página y almacenando el token de continuación si el usuario está haciendo clic de una página a la siguiente secuencialmente O O PUEDE potencialmente almacenar nombres de blobs y hacer su propia paginación.

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