如何批量下载Cloudflare中R2中的文件

548 阅读3分钟

批量下载R2(Cloudflare R2)的文件可以通过编写脚本来实现。以下是使用AWS SDK for Python(Boto3)实现批量下载R2文件的示例。需要先安装Boto3库并进行配置。

准备工作

  1. 安装Boto3库:

    pip install boto3
    
  2. 配置Boto3: 创建或编辑 ~/.aws/credentials 文件,添加你的Cloudflare R2的Access Key和Secret Key:

    [default]
    aws_access_key_id = YOUR_ACCESS_KEY
    aws_secret_access_key = YOUR_SECRET_KEY
    
  3. 创建或编辑 ~/.aws/config 文件,添加你的R2的配置:

    [default]
    region = auto
    endpoint_url = https://YOUR_ACCOUNT_ID.r2.cloudflarestorage.com
    

批量下载R2文件的Python脚本

import boto3
import os

# 设置S3客户端
s3_client = boto3.client('s3')

# R2存储桶名称
bucket_name = 'your-bucket-name'

# 本地存储路径
local_dir = '/path/to/local/directory'

def download_files(bucket_name, local_dir):
    # 列出存储桶中的所有对象
    response = s3_client.list_objects_v2(Bucket=bucket_name)

    if 'Contents' in response:
        for obj in response['Contents']:
            file_key = obj['Key']
            local_file_path = os.path.join(local_dir, file_key)

            # 创建本地目录
            os.makedirs(os.path.dirname(local_file_path), exist_ok=True)

            # 下载文件
            s3_client.download_file(bucket_name, file_key, local_file_path)
            print(f'Downloaded {file_key} to {local_file_path}')
    else:
        print('No files found in the bucket.')

# 调用下载函数
download_files(bucket_name, local_dir)

脚本说明

  1. 设置S3客户端: 使用Boto3创建S3客户端,并配置访问R2所需的凭证。

  2. 列出存储桶中的所有对象: 使用list_objects_v2方法列出存储桶中的所有文件。

  3. 下载文件: 遍历列出的对象,并使用download_file方法将文件下载到本地指定目录。

运行脚本

将上述脚本保存为 download_r2_files.py,并根据你的具体情况修改 bucket_namelocal_dir。然后运行脚本:

python download_r2_files.py

这个脚本会自动将R2存储桶中的所有文件下载到本地指定目录。注意,Cloudflare R2与AWS S3 API兼容,因此可以使用Boto3库来操作R2存储。

有可能会报以下错误,下面是解决方案

in _make_api_call     raise error_class(parsed_response, operation_name)

botocore.exceptions.ClientError: An error occurred (InvalidAccessKeyId) when calling the ListObjectsV2 operation: The AWS Access Key Id you provided does not exist in our records.

这个错误信息表明您提供的 AWS Access Key ID 不存在或无效。以下是一些可能的解决方法和检查步骤:

检查和更新凭证

  1. 确保凭证正确

    • 检查 ~/.aws/credentials 文件,确保 [default] 配置下的 aws_access_key_idaws_secret_access_key 是正确的 Cloudflare R2 的凭证。
    [default]
    aws_access_key_id = YOUR_ACCESS_KEY
    aws_secret_access_key = YOUR_SECRET_KEY
    
  2. 确保配置文件正确

    • 检查 ~/.aws/config 文件,确保 [default] 配置下的 regionendpoint_url 是正确的。
    [default]
    region = auto
    endpoint_url = https://YOUR_ACCOUNT_ID.r2.cloudflarestorage.com
    

使用脚本内显式设置凭证和配置

可以在脚本中显式设置凭证和配置,以确保使用的是正确的 Cloudflare R2 凭证。

import boto3
import os

# 显式设置R2的访问凭证和配置
s3_client = boto3.client(
    's3',
    aws_access_key_id='YOUR_ACCESS_KEY',
    aws_secret_access_key='YOUR_SECRET_KEY',
    endpoint_url='https://YOUR_ACCOUNT_ID.r2.cloudflarestorage.com',
    region_name='auto'
)

# R2存储桶名称
bucket_name = 'your-bucket-name'

# 本地存储路径
local_dir = '/path/to/local/directory'

def download_files(bucket_name, local_dir):
    # 列出存储桶中的所有对象
    response = s3_client.list_objects_v2(Bucket=bucket_name)

    if 'Contents' in response:
        for obj in response['Contents']:
            file_key = obj['Key']
            local_file_path = os.path.join(local_dir, file_key)

            # 创建本地目录
            os.makedirs(os.path.dirname(local_file_path), exist_ok=True)

            # 下载文件
            s3_client.download_file(bucket_name, file_key, local_file_path)
            print(f'Downloaded {file_key} to {local_file_path}')
    else:
        print('No files found in the bucket.')

# 调用下载函数
download_files(bucket_name, local_dir)

检查网络连接

确保您的网络连接正常,能够访问 Cloudflare R2 的 API 端点。如果网络连接有问题,可能会导致无法验证凭证。

检查凭证的权限

确保您提供的 AWS Access Key ID 和 Secret Access Key 具有访问 Cloudflare R2 存储桶的权限。通常,您需要在 Cloudflare R2 中配置正确的访问策略,以允许列出和下载存储桶中的对象。

通过以上步骤和检查,您应该能够解决这个 InvalidAccessKeyId 的问题。如果问题仍然存在,请确保您的凭证和配置文件没有拼写错误,并且 Cloudflare R2 的 API 端点正确无误。