2013-01-10 8 views
11

Utilizzo le librerie client Microsoft Azure .NET per interagire con lo storage cloud di Azure. Devo essere in grado di accedere a ulteriori informazioni su ciascun blob nella sua collezione di metadati. Attualmente sto usando il metodo CloudBlobDirectory.ListBlobs() per ottenere una lista di blob in una particolare directory di una struttura di directory che ho ideato nei nomi dei blob. Il metodo ListBlobs() restituisce un elenco di oggetti IListBlobItem. Hanno solo un paio di proprietà: Url e riferimenti alla directory principale e al contenitore principale. Ho bisogno di arrivare ai metadati degli oggetti blob reali.Come posso ottenere riferimenti a oggetti BlockBlob da CloudBlobDirectory.ListBlobs?

Ho immaginato che ci sarebbe stato un modo per lanciare IListBlobItem su un oggetto BlockBlob o usare IListBlockItem per ottenere un riferimento a BlockBlob, ma non sembra che riesca a trovare un modo per farlo.

La mia domanda è: c'è un modo per ottenere un oggetto BlockBlob da questo metodo, o devo usare un modo diverso per ottenere gli oggetti BlockBlob? Se diverso, allora puoi suggerire un modo per raggiungere questo obiettivo, mentre puoi anche filtrarlo secondo lo schema "directory"?

risposta

11

OK ... Ho trovato un modo per farlo e, anche se sembra un po 'goffo e indiretto, raggiunge la cosa principale che pensavo dovesse essere fattibile, ovvero lanciare IListBlobItem direttamente su un oggetto CloudBlockBlob.

Quello che sto facendo è ottenere l'elenco dal metodo ListBlobs() dell'oggetto Directory e quindi eseguire il looping su ogni elemento nell'elenco e lanciare l'elemento su un oggetto CloudBlockBlob e quindi chiamare il metodo FetchAttributes() per recuperare le proprietà (compresi i metadati). Quindi aggiungi un nuovo oggetto "informazioni" a un nuovo elenco di oggetti informazioni. Ecco il codice che sto usando:

CloudBlobDirectory dir = container.GetDirectoryReference(dirPath); 

var blobs = dir.ListBlobs(true); 

foreach (IListBlobItem item in blobs) 
{ 
    CloudBlockBlob blob = (CloudBlockBlob)item; 
    blob.FetchAttributes(); 
    files.Add(new ImageInfo 
    { 
     FileUrl = item.Uri.ToString(), 
     FileName = item.Uri.PathAndQuery.Replace(restaurantId.ToString().PadLeft(3, '0') + "/", ""), 
     ImageName = blob.Metadata["Name"] 
    }); 
} 

Il concetto complesso "Blob" sembra inutilmente complesso e non sembra raggiungere ciò che avrei pensato sarebbe stata una delle caratteristiche principali del involucro Blob. Cioè, un modo per espandere le capacità di ricerca consentendo una query su nome, directory, contenitore e metadati. Avrei pensato che potevi costruire una query linq che avrebbe letto qualcosa del tipo: "restituisci un elenco di tutti i BLOB nel contenitore" images ", che si trovano nel percorso di directory" natural/landscapes/"che ha una chiave di metadati di" categoria 'con il valore di' tramonto '". Non sembra esserci un modo per farlo e questa sembra essere un'occasione mancata per me. Oh bene.

Se mi sbaglio e sono fuori base qui, per favore fatemelo sapere.

+0

Sono completamente d'accordo con te sul fatto che il design di Microsoft è assolutamente sciocco. Sto migrando da MongoDB e almeno con MongoDB potrei cercare sui metadati. Voglio utilizzare i metadati per contrassegnare i BLOB come aventi proprietà interessanti, quindi in seguito recuperare tutti i BLOB con tali proprietà. Apparentemente questo è impossibile in Windows Azure senza iterare ogni blob o usando il nome del blob per memorizzare i filtri. – NathanAldenSr

2

Questo approccio è stato sviluppato per Java, ma spero che possa essere modificato in qualche modo per adattarsi a qualsiasi altro linguaggio di programmazione supportato. Nonostante la funzionalità richiesta non sia stata ancora sviluppata in modo esplicito, penso di aver trovato un modo diverso (si spera meno cluncky) per accedere ai dati CloudBlockBlob da un elemento ListBlobItem.

Il seguente codice può essere utilizzato per eliminare, ad esempio, ogni blob all'interno di una directory di cemento.

String blobUri; 
CloudBlobClient blobClient = /* Obtain your blob client */ 

try{ 
    CloudBlobContainer container = /* Obtain your blob container */ 

    for (ListBlobItem blobItem : container.listBlobs(blobPrefix)) { 

      if (blobItem instanceof CloudBlob) { 
       blob = (CloudBlob) blobItem; 
       if (blob.exists()){ 
        System.out.println("Deleting blob " + blob.getName()); 
        blob.delete(); 
       } 
      } 
    } 
}catch (URISyntaxException | StorageException ex){ 
     Logger.getLogger(BlobOperations.class.getName()).log(Level.SEVERE, null, ex); 
} 
Problemi correlati