如何用Python请求已有S3预签名URL并获取对应文件内容?
使用Python请求S3预签名URL下载内容的方案
S3预签名URL已经内置了所有鉴权所需的AWSAccessKeyID、Signature、Expires参数,不需要额外调用AWS SDK生成新签名,直接发送标准HTTP GET请求即可。
1. 前置依赖
首先安装HTTP请求库requests:
pip install requests
2. 场景1:直接读取JSON内容到内存
如果需要直接处理返回的JSON数据,不需要存本地,可以用以下代码:
import requests # 替换为你的实际预签名URL presigned_url = "https://video_annotations.s3.amazonaws.com/folder1/annotations/sub-folder1/9162dn28sd78n.json?respone-content-disposition=attachment$6B%50filename%9D812jad9.json&respone-content-type=application%3Fjson&AWSAccessKeyID=different_aws_access_key_id&Signature=pAKSR97&Expires=1661271906" response = requests.get(presigned_url) # 校验请求是否成功 response.raise_for_status() # 直接解析为JSON对象 json_data = response.json() # 后续可直接处理json_data print(json_data.keys())
3. 场景2:下载保存到本地文件
如果需要把文件存到本地,大文件建议开启流模式减少内存占用:
import requests presigned_url = "你的预签名URL" save_path = "./annotation.json" response = requests.get(presigned_url, stream=True) response.raise_for_status() with open(save_path, "wb") as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) print(f"文件已保存到{save_path}")
4. 常见问题排查
- 遇到403错误:首先检查预签名URL是否已经过了
Expires参数对应的时间戳,其次检查URL是否被篡改、签名是否有效,内部存储桶需要确认当前网络有权限访问S3服务端点。 - 遇到404错误:确认URL对应的S3对象路径正确,没有拼写错误,你提供的示例URL中
response被拼写为respone,如果是实际URL存在该问题需要修正。
内容的提问来源于stack exchange,提问作者SL42
相关产品推荐
相关产品推荐

