Python上传文件至Azure Storage后如何下载?遇主机解析失败问题
解决Azure Blob存储的两个问题:主机解析失败与文件下载
一、curl提示"Could not resolve host"的解决步骤
- 核对存储账户名:URL中的
projectName是你的Azure存储账户名称,必须和实际创建的账户名完全一致(存储账户名仅支持小写字母和数字,长度3-24位,若包含大写或特殊字符必然出错)。 - 确认存储账户状态:登录Azure门户,检查该存储账户是否已成功创建且状态正常(无禁用或未完成部署情况)。
- 验证网络连通性:尝试访问已知可用的Azure Blob域名(如
https://demo.blob.core.windows.net),排查是否是本地网络无法访问Azure服务的问题。 - 检查URL格式正确性:正确Blob URL结构为
https://<存储账户名>.blob.core.windows.net/<容器名>/<Blob完整路径>,你的URL中attachments是容器名,16/document1.pdf是Blob路径,需确保各部分无拼写错误。
二、Python下载Blob文件的实现代码
基于你已有的blob_service_client实例,提供两种常用下载方式:
1. 下载到本地文件
# 初始化Blob客户端,替换为你的容器名和Blob路径 blob_client = blob_service_client.get_blob_client(container_name="attachments", blob_name="16/document1.pdf") # 将Blob内容写入本地文件 with open("本地保存的文件名.pdf", "wb") as local_file: local_file.write(blob_client.download_blob().readall())
2. 读取Blob内容到内存(不保存到本地)
blob_client = blob_service_client.get_blob_client(container_name="attachments", blob_name="16/document1.pdf") file_content = blob_client.download_blob().readall() # 可直接对file_content进行后续处理(如解析PDF、转存数据库等)
三、补充:通过curl直接下载Blob的前提
默认Azure Blob是私有访问权限,即使主机解析正常,直接用原URL访问会返回403错误。若需用curl下载,可通过以下两种方式:
- 临时设置容器/Blob为匿名公共读取权限(不推荐生产环境使用)。
- 生成SAS(共享访问签名)令牌,拼接成有权限的URL:
from azure.storage.blob import generate_blob_sas, BlobSasPermissions from datetime import datetime, timedelta # 生成有效期1小时的只读SAS令牌 sas_token = generate_blob_sas( account_name="projectName", # 替换为你的存储账户名 container_name="attachments", blob_name="16/document1.pdf", account_key="<你的存储账户密钥>", # 从Azure门户获取 permission=BlobSasPermissions(read=True), expiry=datetime.utcnow() + timedelta(hours=1) ) # 带SAS令牌的可访问URL sas_url = f"https://projectName.blob.core.windows.net/attachments/16/document1.pdf?{sas_token}"
使用curl下载:
curl -O "{sas_url}"
内容的提问来源于stack exchange,提问作者anjanesh
相关产品推荐
相关产品推荐

