如何使用Box Python SDK从共享链接批量下载文件?
使用Box Python SDK从共享链接下载全部文件
我懂你现在的需求:手里有一个Box共享位置的URL,想通过Python SDK把这个位置下的所有文件都下载下来,一开始翻SDK文档没找到对应的方法对吧?其实SDK里是有处理共享链接的能力的,只是需要用到get_shared_item这个关键接口先解析共享链接,拿到对应的文件夹对象,之后就能遍历下载了。
下面是完整的实现步骤和代码:
核心步骤说明
- 完成OAuth2认证:和你之前的代码逻辑一致,先初始化OAuth2客户端和SDK的Client实例。
- 解析共享链接:用
client.get_shared_item()方法传入共享URL,获取到对应的文件夹对象。 - 遍历文件夹内容:递归或循环处理文件夹里的所有文件(包括子文件夹内的文件,按需选择)。
- 批量下载文件:对每个文件调用
download_to()方法保存到本地路径。
完整代码示例
from boxsdk import Client, OAuth2 from boxsdk.object.folder import Folder import os def download_folder_contents(folder: Folder, save_path: str): """递归下载Box文件夹下的所有文件到本地指定路径""" # 分页获取文件夹内的所有项目(SDK自动处理分页逻辑) for item in folder.get_items(limit=100): if item.type == 'file': # 下载单个文件,保留原文件名 print(f"正在下载: {item.name}") file_save_path = os.path.join(save_path, item.name) with open(file_save_path, 'wb') as local_file: item.download_to(local_file) elif item.type == 'folder': # 处理子文件夹:先创建本地目录,再递归下载 sub_folder_path = os.path.join(save_path, item.name) os.makedirs(sub_folder_path, exist_ok=True) print(f"进入子文件夹: {item.name}") download_folder_contents(item, sub_folder_path) if __name__ == "__main__": # 初始化OAuth2认证 oauth = OAuth2( client_id='你的Client ID', client_secret='你的Client Secret', # 定义令牌存储回调,这里简单打印,实际可以保存到文件/数据库 store_tokens=lambda access_token, refresh_token: print(f"更新令牌: 访问令牌={access_token[:20]}..., 刷新令牌={refresh_token[:20]}..."), # 如果已有有效刷新令牌,可直接传入 # refresh_token='你的刷新令牌' ) # 创建Box客户端实例 client = Client(oauth) # 替换为你的Box共享位置URL shared_link_url = "https://app.box.com/s/xxxxxxxxx" # 解析共享链接,获取对应的文件夹对象 try: shared_folder = client.get_shared_item(shared_link_url) print(f"成功获取共享文件夹: {shared_folder.name}") except Exception as e: print(f"解析共享链接失败: {str(e)}") exit(1) # 本地保存根路径,会自动创建不存在的目录 local_root_path = "./box_downloaded_files" os.makedirs(local_root_path, exist_ok=True) # 开始批量下载 download_folder_contents(shared_folder, local_root_path) print("所有文件下载完成!")
关键细节提醒
get_shared_item方法:这是SDK专门用于处理共享链接的接口,不管是共享文件还是文件夹都能解析,返回对应的Item对象。- 令牌管理:
store_tokens参数需要是一个回调函数,用来接收更新后的access_token和refresh_token,建议把这些令牌持久化存储,下次运行时直接传入refresh_token就能自动完成认证刷新。 - 递归控制:如果不需要下载子文件夹,直接去掉递归逻辑,只处理当前文件夹下的文件即可。
- 分页处理:
folder.get_items(limit=100)每次最多获取100个项目,SDK会自动处理分页,不用担心文件过多导致的获取不全问题。
内容的提问来源于stack exchange,提问作者Munesh
相关产品推荐
相关产品推荐

