2013-01-10 5 views
11

Microsoft Azure .NET 클라이언트 라이브러리를 사용하여 Azure 클라우드 저장소와 상호 작용합니다. 메타 데이터 컬렉션에서 각 BLOB에 대한 추가 정보에 액세스 할 수 있어야합니다. 현재 CloudBlobDirectory.ListBlobs() 메서드를 사용하여 BLOB 이름에서 고안 한 디렉토리 구조의 특정 디렉토리에 BLOB 목록을 가져옵니다. ListBlobs() 메서드는 IListBlobItem 개체의 목록을 반환합니다. 그들은 단지 두 개의 속성 만 가지고 있습니다 : URL과 부모 디렉토리와 부모 컨테이너에 대한 참조. 실제 BLOB 객체의 메타 데이터에 접근해야한다.CloudBlobDirectory.ListBlobs에서 BlockBlob 객체에 대한 참조를 가져 오는 방법은 무엇입니까?

나는 IListBlobItem을 BlockBlob 객체로 형변환하거나 IListBlockItem을 사용하여 BlockBlob에 대한 참조를 얻는 방법이있을 것이라고 생각했지만 그렇게 할 수있는 방법을 찾지 못하는 것 같습니다.

내 질문은 :이 방법으로 BlockBlob 객체를 얻는 방법이 있습니까, 아니면 실제 BlockBlob 객체를 가져 오는 다른 방법을 사용해야합니까? 다르다면, 이것을 달성하는 방법을 제안 할 수있을뿐만 아니라 "디렉토리"계획에 따라 필터링 할 수 있습니까?

답변

11

OK ...이 작업을 수행하는 방법을 찾았습니다. 다소 복잡하고 간접적 인 것처럼 보이지만 IListBlobItem을 CloudBlockBlob 객체에 직접 전달할 수 있어야한다고 생각하는 주요 사항을 달성합니다.

Directory 개체의 ListBlobs() 메서드에서 목록을 가져 와서 목록의 각 항목을 반복하고 항목을 CloudBlockBlob 개체로 캐스팅 한 다음 FetchAttributes() 메서드를 호출하여 속성을 검색합니다. 메타 데이터 포함). 그런 다음 정보 객체의 새 목록에 새 "info"객체를 추가합니다. 전체 "물방울"개념은 불필요하게 복잡한 것 같다 내가 생각이 물방울 래퍼의 주요 기능 중 하나했을 거라고 무엇을 달성하지 않는 것

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

: 여기에 내가 사용하고 코드입니다. 즉, 이름, 디렉토리, 컨테이너 및 메타 데이터에 대한 쿼리를 허용하여 검색 기능을 확장하는 방법입니다. 나는 당신이 linq 쿼리를 구성 할 수 있다고 생각했을 것입니다 : " '자연스러운/풍경 /'디렉토리 경로에있는 '이미지'컨테이너의 모든 blob 목록을 반환합니다. 메타 데이터 키는 ' category '값을'sunset '으로 설정합니다. 그렇게 할 수있는 방법이없는 것 같아요. 그것은 저에게 놓친 기회 인 것 같습니다. 오, 그럼.

내가 틀렸을 때 여기에 근거가 없다면 알려주십시오.

+0

나는 마이크로 소프트의 디자인이 완전히 어리 석다는 것에 전적으로 동의한다. MongoDB에서 마이그레이션 중이며 적어도 MongoDB에서 메타 데이터를 검색 할 수 있습니다. blob을 특정 재미있는 속성으로 플래그를 지정하기 위해 메타 데이터를 사용하고 나중에 이러한 속성으로 모든 blob을 검색하려고합니다. 분명히 Windows Azure에서는 각 blob을 반복하거나 blob의 이름을 사용하여 필터를 저장하지 않고는 불가능합니다. – NathanAldenSr

2

이 접근법은 Java에 대해 개발되었지만 다른 지원되는 프로그래밍 언어에 맞게 수정 될 수 있기를 바랍니다. 당신이 요구하는 기능이 아직 명확하게 개발되지는 않았지만 ListBlobItem 요소의 CloudBlockBlob 데이터에 액세스하는 다른 방법을 찾았다 고 생각합니다.

다음 코드는 콘크리트 디렉토리 내의 모든 blob을 삭제하는 데 사용할 수 있습니다.

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); 
} 
관련 문제