演習 - BLOB 参照を取得する

完了

Blob Storage のコンテナーを操作するには、BlobContainerClient オブジェクトを使います。 前のユニットで見たコンテナーの作成に加えて、BlobContainerClient オブジェクトを使うと、コンテナー内の BLOB の一覧を表示することもできます。

コンテナー内の BLOB を列挙する

BlobContainerClientGetBlobsAsync メソッドを使用すると、コンテナーの BLOB の一覧を入手できます。 バックグラウンドでクライアントが Azure に 1 回以上の HTTP 呼び出しを実施し、コンテナー内のすべての BLOB の一覧を取得します。 このメソッドは非同期であるため、結果を読み取る際に await を実行する必要があります。 これらはすべて 1 つの HTTP 呼び出しで返されるわけではありません。 次のコードは foreach ループで結果を読み取る標準的なパターンを示します。

AsyncPageable<BlobItem> blobs = containerClient.GetBlobsAsync();

await foreach (var blob in blobs)
{
    // Read the BlobItem and work with it here
}

BlobContainerClientlistBlobs メソッドを使用すると、コンテナーの BLOB の一覧を入手できます。 バックグラウンドでクライアントが Azure に 1 回以上の HTTP 呼び出しを実施し、コンテナー内のすべての BLOB の一覧を取得します。 このメソッドからは、Iterable<BlobItem> を実装する PagedIterable<BlobItem> が返されます。 その後、一度に 1 項目ずつ、または項目のページ単位で読み取ることができます。 次のコードは for ループで結果を読み取る標準的なパターンを示します。

for (BlobItem blob : blobContainerClient.listBlobs()) {
    // Read the BlobItem and work with it here
}
blobContainerClient.listBlobs()
    .stream()
    .map(blobItem -> /* Read the BlobItem and work with it here */)
    .collect(Collectors.toList());

演習

アプリケーションの機能の 1 つに、API からの BLOB の一覧を取得する必要があるものがあります。 前述のパターンを使用して、コンテナーのすべての BLOB を列挙します。 一覧を処理してゆくと、各 BLOB の名前を取得できます。

エディターを使用して、BlobStorage.csGetNames を次のコードに置き換えて変更内容を保存します。

public async Task<IEnumerable<string>> GetNames()
{
    List<string> names = new List<string>();

    BlobServiceClient blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString);

    // Get the container the blobs are saved in
    BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.FileContainerName);

    // This gets the info about the blobs in the container
    AsyncPageable<BlobItem> blobs = containerClient.GetBlobsAsync();

    await foreach (var blob in blobs)
    {
        names.Add(blob.Name);
    }
    return names;
}

FilesController はこのメソッドが返す名前を処理して、名前を URL に変換します。 クライアントに返されると、名前はページでハイパーリンクとしてレンダリングされます。

エディターを使用して、BlobStorage.javalistNames を次のコードに置き換えて変更内容を保存します。

public List<String> listNames() {
    return blobContainerClient.listBlobs()
      .stream()
      .map(BlobItem::getName)
      .collect(Collectors.toList());
}

IndexBeanindex.xhmtl はこのメソッドが返す名前を処理し、ページ上にハイパーリンクとして表示します。