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

生成Azure Data Lake Storage的SAS URL后无法下载文件排查

问题:Python生成Azure Data Lake Storage SAS令牌后无法下载文件

我希望通过Python从本地访问Azure Data Lake Storage文件系统文件夹下的文件,已通过以下代码生成SAS令牌并创建SAS URL,但无法通过该脚本下载文件,请问问题出在哪里?

sas_file = generate_file_sas(account_name=account_name,
                  file_system_name = file_system_name ,
                  directory_name = directory_name ,
                  file_name = file_name,
                  credential=account_key,
                  expiry=datetime.utcnow() + timedelta(hours=1)
                  )
sas_url = 'https://' + account_name+'.blob.core.windows.net/' + container_name + '/' + directory_name + '/' + file_name + '?'+  sas_file

可能的问题及解决方法

  • 权限未明确指定:generate_file_sas函数默认不会赋予读取权限,必须显式设置permission="r"(只读),否则生成的SAS令牌没有下载文件的权限,修改时直接在函数参数中添加该配置即可。
  • URL路径变量不匹配:代码构建sas_url时使用了container_name,但ADLS Gen2中file_system_name等价于Blob存储的容器,这里应该替换为file_system_name,否则URL指向的容器不存在,导致访问失败。
  • 路径特殊字符未编码:如果directory_name或file_name包含空格、&、%等特殊字符,直接拼接URL会导致路径解析错误,需用urllib.parse.quote()对路径部分进行URL编码。
  • 时间有效性问题:确保生成令牌时使用的是UTC时间(代码中已用datetime.utcnow()),若系统时间与UTC偏差较大,可能导致令牌未生效或提前过期,可验证SAS令牌中的se参数确认过期时间是否正确。
  • SDK版本参数差异:不同版本的Azure存储SDK对generate_file_sas的参数要求可能有变化,比如部分版本需要指定resource_type,建议检查对应版本的SDK文档确认参数正确性。

修改后的示例代码

from azure.storage.filedatalake import generate_file_sas
from datetime import datetime, timedelta
import urllib.parse
import requests

# 替换为你的实际配置
account_name = "your_account_name"
file_system_name = "your_file_system"
directory_name = "your_directory"
file_name = "your_file.txt"
account_key = "your_account_key"

# 生成带读取权限的SAS令牌
sas_file = generate_file_sas(
    account_name=account_name,
    file_system_name=file_system_name,
    directory_name=directory_name,
    file_name=file_name,
    credential=account_key,
    expiry=datetime.utcnow() + timedelta(hours=1),
    permission="r"  # 显式添加读取权限
)

# 对路径中的特殊字符进行URL编码
encoded_dir = urllib.parse.quote(directory_name)
encoded_file = urllib.parse.quote(file_name)

# 构建正确的SAS URL
sas_url = f"https://{account_name}.blob.core.windows.net/{file_system_name}/{encoded_dir}/{encoded_file}?{sas_file}"

# 测试文件下载
response = requests.get(sas_url)
if response.status_code == 200:
    with open("downloaded_file.txt", "wb") as f:
        f.write(response.content)
    print("文件下载成功")
else:
    print(f"下载失败,状态码:{response.status_code},错误信息:{response.text}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:30:32