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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:41:30