Azure Blob列表分页

时间:2017-04-22 23:19:30

标签: azure paging azure-blob-storage

我的容器中有3000个文件。在我的gridview中,我显示容器blob的列表但是3000太多而且对性能不好(我的想法:))。

我需要一个分页代码,例如我的网格页面大小是50我将在gridview中显示我的容器中的第一个50 blob。当然我需要在pageindexchanging更多代码:)

或者它不会影响表现吗?

2 个答案:

答案 0 :(得分:3)

根据您的说明,我建议您尝试使用azure storage SDK的ListBlobsSegmented方法来满足您的要求。

ListBlobsSegmented inclue maxResults参数。

的maxResults: 一个非负整数值,指示一次返回的最大结果数,最多为每操作限制5000.如果此值为null,将返回最大可能的结果数,最多为5000。

因此,您可以在首次加载页面时搜索50条记录。

当你的页面索引发生变化时,你可以调用搜索方法,根据gridview索引搜索正确数量的blob。

注意:要包含性能,我们不会立即获取所有blob来知道容器中有多少blob。所以我们无法知道blob的总数。我建议你可以在第一时间搜索100个blob,如果客户点击第2页,它将搜索下100个blob。

这是一个示例演示,希望它能为您提供一些提示: gridview的:

<asp:GridView ID="GridView1" AllowPaging="true" PageSize="50"  OnPageIndexChanging="GridView1_PageIndexChanging" runat="server">
 </asp:GridView>

代码背后:

  BlobContinuationToken continuationToken = null;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //1*100 is the numebr of blobs you will list
                ListBlobResult(1*100);
            }
        }

        public void ListBlobResult(int index)
        {
           CloudStorageAccount storageAccount = CloudStorageAccount.Parse("connectionstring");
           var client = storageAccount.CreateCloudBlobClient();
           var container = client.GetContainerReference("foo2");
            string prefix = null;
            bool useFlatBlobListing = true;
            BlobListingDetails blobListingDetails = BlobListingDetails.All;
           // int maxBlobsPerRequest = 50;
            List<IListBlobItem> blobs = new List<IListBlobItem>();

            if (index <= 5000)
            {
                var listingResult = container.ListBlobsSegmented(prefix, useFlatBlobListing, blobListingDetails, index, continuationToken, null, null);
                continuationToken = listingResult.ContinuationToken;
                blobs.AddRange(listingResult.Results);
            }
            else
            {
                do
                {
                    var listingResult = container.ListBlobsSegmented(prefix, useFlatBlobListing, blobListingDetails, index, continuationToken, null, null);
                    continuationToken = listingResult.ContinuationToken;
                    blobs.AddRange(listingResult.Results);
                    index = index - 5000;
                }
                while (continuationToken != null);
            }
            DataTable d1 = new DataTable();
            d1.Columns.Add("Id");
            d1.Columns.Add("Url");
            foreach (var item in blobs)
            {
                if (item.GetType() == typeof(CloudBlockBlob))
                {
                    CloudBlockBlob blob = (CloudBlockBlob)item;
                    d1.Rows.Add(blob.Name, blob.Uri);
                }
            }

            GridView1.DataSource = d1;
            GridView1.DataBind();
        }


        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {

            GridView1.PageIndex = e.NewPageIndex;
            //(e.NewPageIndex*100)+100 is the numebr of blobs you will list
            ListBlobResult((e.NewPageIndex*100)+100);    
        }

结果: enter image description here

答案 1 :(得分:2)

我在JAVA中搜索分页示例,由于某种原因,谷歌将这个问题排在前3位。无论如何,我找到了一个解决方案,如果有人有兴趣使用Java和最新的MS azure客户端进行分页,那么您去吧。 >

void listAllForContainer(BlobContainerClient container) {
    String token = null;
    do {
        PagedResponse<BlobItem> pr = container
                .listBlobs(options, token, Duration.ofSeconds(60))
                .iterableByPage()
                .iterator()
                .next();

        token = pr.getContinuationToken();
        List<BlobItem> pageItems = pr.getValue();
        pageItems.forEach(i->System.out.println(i.getName()));

    } while (token != null);
}

天蓝色的神器

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-storage-blob</artifactId>
        <version>12.X.X</version>
    </dependency>