You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python通过虚拟文件夹SAS URL列出Azure Blob时遇InvalidUri错误

问题修复:Azure Blob Storage目录级SAS列出Blob报错InvalidUri

问题原因

你错误地将虚拟文件夹级别的URL传给了ContainerClient.from_container_url方法,该方法仅接受容器级别的URL(格式为https://<account>.blob.core.windows.net/<container>),因此触发InvalidUri错误。此外,目录级SAS(sr=d)需要配合前缀过滤来定位目标目录下的Blob。

解决方案

以下是两种可行的修复方式:

方式1:容器级SAS + 前缀过滤

如果能获取容器级别的SAS URL,直接用ContainerClient并指定目录前缀:

from azure.storage.blob import ContainerClient

# 容器级SAS URL(格式:https://<account>.blob.core.windows.net/<container>?<sas-token>)
container_sas_url = 'https://tenantdatalake.blob.core.windows.net/folder1?sp=racwdlmeop&st=2022-12-16T09:55:06Z&se=2022-12-16T17:55:06Z&sv=2021-06-08&sr=c&sig=xxxx'
container_client = ContainerClient.from_container_url(container_sas_url)

# 列出folder2/New目录下的所有Blob,前缀需包含完整路径并以/结尾
blobs = list(container_client.list_blobs(prefix='folder2/New/'))
for blob in blobs:
    print(blob.name)

方式2:目录级SAS + BlobServiceClient

如果只能使用目录级SAS URL,通过BlobServiceClient来列出目标目录下的Blob:

from azure.storage.blob import BlobServiceClient

# 目录级SAS URL
directory_sas_url = 'https://tenantdatalake.blob.core.windows.net/folder1/folder2?sp=racwdlmeop&st=2022-12-16T09:55:06Z&se=2022-12-16T17:55:06Z&sv=2021-06-08&sr=d&sig=xxxx&sdd=1'

# 从目录SAS URL构造BlobServiceClient
service_client = BlobServiceClient.from_service_url(directory_sas_url)

# 列出当前目录下New子目录的Blob,前缀为'folder2/New/'
blobs = list(service_client.list_blobs(container_name='folder1', prefix='folder2/New/'))
for blob in blobs:
    print(blob.name)

关键注意事项

  • 确保SAS令牌包含list权限(即sp参数包含l),否则无法执行Blob列表操作。
  • 虚拟文件夹本质是Blob名称的前缀,因此list_blobs的prefix参数要以/结尾,避免匹配到名称相似的非目标Blob。

内容的提问来源于stack exchange,提问作者gaut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:15:22