如何通过SAS URL递归下载ADLS2存储Blob目录下的所有文件
递归下载ADLS Gen2 Blob目录(基于SAS URL)
方法1:使用Azure CLI
Azure CLI的az storage blob download-batch命令支持通过SAS token认证,可直接实现递归下载,步骤如下:
- 从你的目录SAS URL中拆分核心信息:
- 存储账户名:提取URL中
https://<account-name>.blob.core.windows.net/段的<account-name> - 容器名:URL中账户名后的第一个路径段,比如
https://xxx.blob.core.windows.net/<container>/dir/...里的<container> - 目录前缀:目标目录的完整路径(末尾带
/),比如dir/subdir/ - SAS token:URL中
?之后的完整参数串,比如?sv=2023-11-03&ss=bfqt&srt=sco&sp=rwdlacupiytfx&se=2024-...
- 存储账户名:提取URL中
- 执行下载命令:
该命令会自动遍历指定前缀下的所有Blob,保持原目录结构下载到本地。az storage blob download-batch \ --destination /本地目标目录路径 \ --source <容器名> \ --account-name <存储账户名> \ --prefix <目录前缀> \ --sas-token "<SAS token>" \ --recursive
方法2:使用Python SDK(azure-storage-blob)
如果需要自定义下载逻辑,可通过Python SDK实现,核心是用SAS URL初始化客户端后递归遍历Blob:
- 安装依赖包:
pip install azure-storage-blob - 实现代码:
from azure.storage.blob import BlobServiceClient import os # 替换为你的目录SAS URL sas_url = "https://<account-name>.blob.core.windows.net/<container>/dir/subdir?<sas-token>" # 拆分SAS URL获取账户地址和token account_url, sas_token = sas_url.split('?', 1) # 初始化Blob服务客户端 blob_service_client = BlobServiceClient(account_url=account_url, credential=sas_token) # 提取容器名和目标目录前缀 path_parts = account_url.split('/') container_name = path_parts[-1] prefix = '/'.join(path_parts[4:]) + '/' if len(path_parts) > 4 else '' container_client = blob_service_client.get_container_client(container_name) # 遍历并下载所有Blob for blob in container_client.list_blobs(name_starts_with=prefix): # 构建本地保存路径,保持原目录结构 local_file_path = os.path.join("/本地目标目录", blob.name) # 创建本地目录(如果不存在) os.makedirs(os.path.dirname(local_file_path), exist_ok=True) # 下载文件 with open(local_file_path, "wb") as local_file: blob_data = container_client.download_blob(blob.name).readall() local_file.write(blob_data)
关键注意事项
- 确保你的SAS URL拥有**读取(r)和列出(l)**权限,否则无法遍历目录及下载文件。
- 若SAS URL为目录级专属,需保证前缀与目标目录完全匹配,避免误下载无关文件。
- 针对超大型目录,可在SDK中添加分页遍历、多线程下载逻辑提升效率。
内容的提问来源于stack exchange,提问作者sargeMonkey
相关产品推荐
相关产品推荐

