如何用Python的requests包下载Oracle Cloud Storage Classic容器文件夹内容
没问题,我来帮你搞定这个需求!要下载/test/test1/前缀下的所有对象,咱们可以分两步走:先把这个前缀下的所有文件列出来,再逐个调用你现有的下载方法来批量下载。下面是具体的实现思路和代码示例,完全适配你已有的代码结构:
第一步:获取指定前缀下的所有对象列表
Oracle Cloud Storage Classic的API支持通过prefix参数筛选容器内的对象,咱们可以用这个参数拿到test1/前缀下的所有文件。这里需要解析API返回的XML响应来提取对象名称:
import requests import xml.etree.ElementTree as ET import os def get_objects_with_prefix(self, ora_url, username, password, container_name, prefix): # 复用你已有的token生成方法 token = self.create_session_oraclecloud(ora_url, username, password) # 构造列表对象的请求URL:基础URL + 容器名 list_objects_url = f"{ora_url}{container_name}" headers = {'X-Auth-Token': token} # 通过prefix参数筛选目标文件夹下的所有对象 params = {'prefix': prefix} # 发送请求并处理错误 response = requests.get(list_objects_url, headers=headers, params=params) response.raise_for_status() # 解析XML响应,提取对象名称(注意Oracle的响应带命名空间) root = ET.fromstring(response.content) namespace = {'ns': 'http://docs.openstack.org/common/api/v1.0'} object_names = [] for obj in root.findall('ns:object', namespace): obj_name = obj.find('ns:name', namespace).text object_names.append(obj_name) return object_names
第二步:批量下载所有对象
拿到对象列表后,咱们循环调用你已有的download_file_oraclecloud方法,同时处理本地目录的创建,保持和云端的文件夹结构一致:
def download_folder_oraclecloud(self, ora_url, username, password, container_name, prefix, local_root_dir): # 获取目标前缀下的所有对象 object_list = self.get_objects_with_prefix(ora_url, username, password, container_name, prefix) # 确保本地根目录存在 os.makedirs(local_root_dir, exist_ok=True) for obj_name in object_list: # 去掉前缀,保留相对路径,构造本地文件路径 relative_path = obj_name[len(prefix):] local_file_path = os.path.join(local_root_dir, relative_path) # 创建本地子目录(如果有) os.makedirs(os.path.dirname(local_file_path), exist_ok=True) # 调用你已有的单个文件下载方法 try: self.download_file_oraclecloud( ora_url=ora_url, username=username, password=password, container_name=container_name, file_name=obj_name, local_file_name=local_file_path, url=ora_url # 这里复用你的ora_url参数,和原方法保持一致 ) print(f"成功下载:{obj_name}") except Exception as e: print(f"下载失败 {obj_name}:{str(e)}")
调用示例
假设你的基础存储URL是https://storage.us2.oraclecloud.com/v1/Storage-a428615/,要下载容器test下test1/前缀的所有文件到本地./downloaded_test1目录,直接调用:
self.download_folder_oraclecloud( ora_url='https://storage.us2.oraclecloud.com/v1/Storage-a428615/', username='你的Oracle云用户名', password='你的Oracle云密码', container_name='test', prefix='test1/', # 注意结尾的斜杠,避免误匹配其他前缀的文件 local_root_dir='./downloaded_test1' )
几个注意点
- 前缀一定要加结尾的斜杠(比如
test1/而不是test1),这样只会匹配以test1/开头的对象,不会误下载test12.txt这类文件名相似的文件 - 解析XML时必须指定命名空间,否则会找不到对象节点
- 代码会自动创建本地子目录,保持和云端的文件夹结构完全一致
内容的提问来源于stack exchange,提问作者Sruthi
相关产品推荐
相关产品推荐

