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

Cur*_*ous 4 azure azure-storage azure-storage-blobs

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

directory/image-name
Run Code Online (Sandbox Code Playgroud)

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

var options = { "prefix":directory }
Run Code Online (Sandbox Code Playgroud)

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

var options = { "delimiter":"/", "prefix":directory }
Run Code Online (Sandbox Code Playgroud)

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

Bur*_*ris 6

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

var options = { "delimiter":"/", "prefix":directory+"/" }
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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