使用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
相关产品推荐
相关产品推荐

