从指定的阿里云OSS Bucket下载所有对象到本地指定的目录。
主要脚本
#!/usr/bin/python3
# download_ossobject_from_aliyun.py
import oss2
import os
def download_objects(bucket_name, endpoint, access_key_id, access_key_secret, local_dir):
# 配置认证信息
auth = oss2.Auth(access_key_id, access_key_secret)
# 初始化Bucket实例
bucket = oss2.Bucket(auth, endpoint, bucket_name)
# 如果本地目录不存在,则创建
if not os.path.exists(local_dir):
os.makedirs(local_dir)
# 列出bucket中的所有object并下载
for obj in oss2.ObjectIterator(bucket):
# 构建完整的本地文件路径
local_file_path = os.path.join(local_dir, obj.key)
# 如果是目录,则创建目录结构
if obj.key[-1] == '/':
os.makedirs(local_file_path, exist_ok=True)
else:
# 下载文件
bucket.get_object_to_file(obj.key, local_file_path)
print(f'Downloaded {obj.key} to {local_file_path}')
# 配置参数
bucket_name = 'bucketname'
endpoint = 'oss-cn-shanghai.aliyuncs.com'
access_key_id = 'AccessKey ID for OSS'
access_key_secret = 'AccessKey Secret for OSS '
local_dir = '/data/app/oss_from_aliyun/data/xxx'
# 调用函数下载文件
download_objects(bucket_name, endpoint, access_key_id, access_key_secret, local_dir)
脚本测试
[root@dev-rocky9-shanghai-area1 ~]# python3 /data/python/download_ossobject_from_aliyun.py # 下载阿里云OSS Bucket 'xxx' 中的所有对象至本地目录 '/data/app/oss_from_aliyun/data/xxx'
Downloaded data/test_txt_for_zhupengfei.txt to /data/app/oss_from_aliyun/data/xxx/data/test_txt_for_zhupengfei.txt
注意检查 OSS 权限
我在首次运行下载脚本的时候遇到了错误信息,根据报错看到可能是AccessKey ID和AccessKey Secret可能没有被赋予下载对象的权限,要么检查并调整RAM对应用户或角色是否具有OSS的GetObject权限。要么检查调整Bucket的ACL(Access Control List)限制了公开访问或者特定用户的访问。
Traceback (most recent call last): File "/data/python/download_ossobject_from_aliyun.py", line 39, in <module> download_objects(bucket_name, endpoint, access_key_id, access_key_secret, local_dir) File "/data/python/download_ossobject_from_aliyun.py", line 28, in download_objects bucket.get_object_to_file(obj.key, local_file_path) File "/usr/local/lib/python3.9/site-packages/oss2/api.py", line 931, in get_object_to_file result = self.get_object(key, byte_range=byte_range, headers=headers, progress_callback=progress_callback, File "/usr/local/lib/python3.9/site-packages/oss2/api.py", line 841, in get_object resp = self.__do_object('GET', key, headers=headers, params=params) File "/usr/local/lib/python3.9/site-packages/oss2/api.py", line 2991, in __do_object return self._do(method, self.bucket_name, key, **kwargs) File "/usr/local/lib/python3.9/site-packages/oss2/api.py", line 241, in _do raise e oss2.exceptions.AccessDenied: {'status': 403, 'x-oss-request-id': 'xxx', 'details': {'Code': 'AccessDenied', 'Message': 'You have no right to access this object because of bucket acl.', 'RequestId': 'xxx', 'HostId': 'xxx.oss-cn-shanghai.aliyuncs.com', 'EC': '0003-00000001', 'RecommendDoc': 'https://api.aliyun.com/troubleshoot?q=0003-00000001'}}