Azure Blob 列表分页
Azure Blob List Paging
我的容器中有 3000 个 files.In 我的 gridview 我正在显示容器 blob 的列表,但是 3000 太多了并且不利于性能(我的想法:))。
我需要一个分页代码,例如我的网格页面大小是 50 我将在 gridview.Of 我的第一页的容器中显示前 50 个 blob 我需要在 pageindexchanging 更多代码:)
还是不影响性能?
根据你的描述,我建议你可以尝试使用azure storage SDK的ListBlobsSegmented方法来实现你的需求。
ListBlobsSegmented 包含 maxResults 参数。
最大结果:
一个非负整数值,指示一次返回的最大结果数,最多 5000 个操作限制。如果此值为 null,将返回最大可能的结果数,最多 5000 个。
所以当您的页面首先加载时,您可以只搜索 50 条记录。
当您的页面索引发生变化时,您可以调用搜索方法根据gridview索引搜索正确数量的blob。
注意:为了包括性能,我们不会一次获取所有 blob 以了解您的容器中有多少 blob。所以我们无法知道总数 blobs.I 建议您可以第一次搜索 100 个 blob,如果客户点击第 2 页,它将搜索接下来的 100 个 blob。
这里有一个示例演示,希望它能给你一些提示:
网格视图:
<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);
}
结果:
我在 JAVA 中搜索分页示例,出于某种原因 google 将此问题排在前 3 位。无论如何,我找到了解决方案,如果有人对如何使用 [=17 进行分页感兴趣的话=] 和最新的 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>
我的容器中有 3000 个 files.In 我的 gridview 我正在显示容器 blob 的列表,但是 3000 太多了并且不利于性能(我的想法:))。
我需要一个分页代码,例如我的网格页面大小是 50 我将在 gridview.Of 我的第一页的容器中显示前 50 个 blob 我需要在 pageindexchanging 更多代码:)
还是不影响性能?
根据你的描述,我建议你可以尝试使用azure storage SDK的ListBlobsSegmented方法来实现你的需求。
ListBlobsSegmented 包含 maxResults 参数。
最大结果: 一个非负整数值,指示一次返回的最大结果数,最多 5000 个操作限制。如果此值为 null,将返回最大可能的结果数,最多 5000 个。
所以当您的页面首先加载时,您可以只搜索 50 条记录。
当您的页面索引发生变化时,您可以调用搜索方法根据gridview索引搜索正确数量的blob。
注意:为了包括性能,我们不会一次获取所有 blob 以了解您的容器中有多少 blob。所以我们无法知道总数 blobs.I 建议您可以第一次搜索 100 个 blob,如果客户点击第 2 页,它将搜索接下来的 100 个 blob。
这里有一个示例演示,希望它能给你一些提示: 网格视图:
<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);
}
结果:
我在 JAVA 中搜索分页示例,出于某种原因 google 将此问题排在前 3 位。无论如何,我找到了解决方案,如果有人对如何使用 [=17 进行分页感兴趣的话=] 和最新的 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>