2013-01-10 12 views
11

Korzystam z bibliotek klienta Microsoft Azure .NET do interakcji z magazynem w chmurze Azure. Muszę mieć dostęp do dodatkowych informacji o każdym obiekcie blob w jego zbiorze metadanych. Obecnie używam metody CloudBlobDirectory.ListBlobs(), aby uzyskać listę obiektów typu blob w określonym katalogu struktury katalogów, którą wymyśliłem w nazwach obiektów blob. Metoda ListBlobs() zwraca listę obiektów IListBlobItem. Mają tylko kilka właściwości: adres URL i odniesienia do katalogu nadrzędnego i kontenera nadrzędnego. Muszę dostać się do metadanych rzeczywistych obiektów blob.Jak mogę uzyskać odwołania do obiektów BlockBlob z CloudBlobDirectory.ListBlobs?

Wyobraziłem sobie, że istnieje sposób, aby rzucić IListBlobItem do obiektu BlockBlob lub użyć IListBlockItem, aby uzyskać odwołanie do BlockBlob, ale nie można znaleźć sposobu, aby to zrobić.

Moje pytanie brzmi: czy istnieje sposób na uzyskanie obiektu BlockBlob z tej metody, czy też muszę użyć innego sposobu uzyskania rzeczywistych obiektów BlockBlob? Jeśli jest inaczej, czy możesz zaproponować sposób, aby to osiągnąć, jednocześnie będąc w stanie filtrować według schematu "katalogu"?

Odpowiedz

11

OK ... Znalazłem sposób na zrobienie tego, i choć wydaje się trochę nieostrożny i pośredni, osiąga on główną rzecz, o której myślałem, że powinna być wykonalna, czyli rzut IListBlobItem bezpośrednio do obiektu CloudBlockBlob.

Co robię, to pobranie listy z metody ListBlobs() obiektu Directory, a następnie zapętlenie każdej pozycji na liście i przesłanie elementu do obiektu CloudBlockBlob, a następnie wywołanie metody FetchAttributes() w celu pobrania właściwości (w tym metadane). Następnie dodaj nowy obiekt "info" do nowej listy obiektów informacyjnych. Oto kod używam:

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"] 
    }); 
} 

Cała „Blob” Pomysł ten wydaje się niepotrzebnie skomplikowane i nie wydaje się, aby osiągnąć to, co bym pomyślał, byłaby jedną z głównych cech owijki Blob. Oznacza to, że można rozszerzyć możliwości wyszukiwania, umożliwiając zapytanie o nazwę, katalog, kontener i metadane. Pomyślałabym, że możesz skonstruować zapytanie linq, które brzmiałoby mniej więcej tak: "zwróć listę wszystkich obiektów blob w kontenerze" images ", które znajdują się w ścieżce katalogu" natural/landscapes/", która ma klucz metadanych" kategoria "o wartości" zachód ". Wydaje się, że nie ma na to sposobu i wydaje mi się to straconą szansą. No cóż.

Jeśli się mylę i nie mam tutaj bazy, proszę dać mi znać.

+0

Całkowicie zgadzam się z tobą, że projekt Microsoftu jest całkowicie głupi. Przeprowadzam migrację z MongoDB i przynajmniej z MongoDB mogę wyszukiwać metadane. Chcę używać metadanych do zaznaczania obiektów typu blob jako mających pewne interesujące właściwości, a następnie odzyskać wszystkie obiekty blob z tymi właściwościami. Najwyraźniej nie jest to możliwe w systemie Windows Azure bez przeprowadzania iteracji każdego obiektu typu blob lub używania nazwy obiektu blob do przechowywania filtrów. – NathanAldenSr

2

To podejście zostało opracowane dla Java, ale mam nadzieję, że będzie można go w jakiś sposób zmodyfikować, aby pasował do dowolnego obsługiwanego języka programowania. Pomimo, że żądana funkcjonalność nie została jeszcze opracowana w sposób jawny, myślę, że znalazłem inny (na pewno mniej cluncky) sposób uzyskiwania dostępu do danych CloudBlockBlob z elementu ListBlobItem.

Następujący kod może zostać użyty do usunięcia, na przykład, każdego obiektu typu blob wewnątrz konkretnego katalogu .

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); 
} 
Powiązane problemy