分隔符如何在Azure Blob存储中工作?

时间:2013-07-02 19:11:57

标签: azure azure-storage azure-storage-blobs

我使用以下命名约定将图像文件存储为Azure存储中的blob:

directory/image-name

尝试在服务器上的Javascript中使用BlobService.listBlobs(container, options, callback)检索blob时,我使用:

var options = { "prefix":directory }

它只返回以目标名称开头的blob,正如我所料,但我想我也可以使用:

var options = { "delimiter":"/", "prefix":directory }

并找回相同的blob,可能没有名字中的前缀。相反,我什么都没回来。使用分隔符的正确方法是什么?如果只使用前缀获得所需的项目,那么拥有它有什么意义?

1 个答案:

答案 0 :(得分:2)

我没有使用JavaScript中的REST API,但我认为你缺少的是目录名后的斜杠,所以我建议:

var options = { "delimiter":"/", "prefix":directory+"/" }

Windows Azure Storage实际上没有目录,在底层实现中,容器中的所有blob都只是平面列表,blob名称(不是容器名称)可能包含斜杠。调用ListBlobs REST API时,分隔符是一个选项,允许您模拟类似目录的行为。如果启用了分隔符选项,并且超过前缀的blob名称部分包含分隔符,则回复将省略该blob。

为了说明,让我们命名一些blob,假设所有这些blob都在同一个容器中https://myaccount.blob.core.windows.net/mycontainer“:

a/b/extra.txt
a/bloba.txt
a/blobb.txt
other.txt

那么如果你使用前缀“a /”调用该容器上的listBlobs并且没有指定分隔符,它将返回前三个名称,因为它们都具有“a /”前缀。

如果您使用相同的“a /”前缀调用listBlobs并将分隔符设置为“/”,则只能获得中间两个名称;该服务省略了a / b / extra.txt,因为它位于(模拟的)子目录“b”中。