假设我的 Azure 存储帐户中有以下文件结构。
container-1
directory-1
file-1-1.csv
file-1-2.json
file-1-3.jpeg
directory-2
file-2-1.csv
file-1.csv
file-2.csv
container-2
directory-1
directory-1-1
file1-1-1.csv
我只想列出container-1内的文件(file-1.csv、file-2.csv),而不列出任何其他结果是否有办法提出这样的请求。
目前我使用的网址是这样的:
https://${account}.blob.core.windows.net/container-1?comp=list&restype=container&prefix=/
返回:
directory-1
directory-1/file-1-1.csv
directory-1/file-1-2.json
directory-1/file-1-3.jpeg
directory-2
directory-2/file-2-1.csv
file-1.csv
file-2.csv
虽然我只需要:
file-1.csv
file-2.csv
无法使用 Blob 存储 REST API 仅列出 Blob。那里提供的服务器端过滤支持非常有限,仅列出 blob 并不是其中之一。
一种“hacky”方法是按前缀过滤 blob。假设容器级别的所有文件都以一些预定义的字符开头(例如
file
),并且该级别没有虚拟目录以这些字符开头,那么您可以指定 file
作为前缀,然后 REST API 将仅返回其名称以这些字符开头的 blob。
您可以向 Azure Blob REST API 发出
List Blobs
请求。在该请求中,您可以在查询字符串中指定分隔符。使用分隔符 /
。
这将导致结果列出位于请求根目录中的所有 blob,以使用 XML
<Blob>
元素。不在搜索根目录中的所有 Blob 将显示在带有文件夹名称的 <BlobPrefix>
元素下。丢弃所有 <BlobPrefix>
元素,您将只剩下未包含在(另一个)“文件夹”中的 blob。
您没有直接的方法来做到这一点。 我使用Python如下:
blob_list = container_client.list_blobs()
folder_path = "folder/path/"
for blob in blob_list:
is_folder = True if blob.content_settings["content_md5"] is None else False
if not is_folder and blob.name.count('/') == folder_path.count('/'):
print(blob.name)