4

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

directory/image-name

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

var options = { "prefix":directory }

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

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

并取回相同的 blob,可能名称中没有前缀。相反,我什么也得不到。使用分隔符的正确方法是什么?如果您只使用前缀获得想要的项目,那么拥有它有什么意义?

4

1 回答 1

6

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

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

Windows Azure 存储实际上没有目录,在底层实现中,容器中的所有 blob 都只是平面列表,并且 blob 名称(不是容器名称)可能包含斜杠。分隔符是调用 ListBlobs REST API 时的一个选项,可让您模拟类似目录的行为。如果启用了分隔符选项,并且前缀之后的 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”中。

于 2014-07-16T03:02:11.340 回答