📜  将文件上传到 AWS S3 (1)

📅  最后修改于: 2023-12-03 15:09:37.521000             🧑  作者: Mango

将文件上传到 AWS S3

AWS S3(Simple Storage Service)是亚马逊提供的对象存储服务,可以让用户通过简单的 API 来存储和检索任意数量的数据,适用于多种应用场景。本文将介绍如何使用 AWS S3 的 SDK 将文件上传到 S3 中。

准备工作

在开始之前,我们需要安装 AWS SDK for Python(也称为 Boto3),它适用于使用 Python 连接和操作 AWS 服务。可以通过 pip 安装:

pip install boto3

接下来,我们需要在 AWS 控制台中创建一个 S3 存储桶,并为 API 访问生成一个访问密钥ID 和秘密访问密钥。

连接 S3

首先,我们需要引入 Boto3,通过以下代码连接到 S3:

import boto3

# 创建 S3 客户端
s3 = boto3.client('s3',
                  region_name='us-west-2',
                  aws_access_key_id=ACCESS_KEY,
                  aws_secret_access_key=SECRET_KEY)

除了 aws_access_key_idaws_secret_access_key,还可以指定 region_name,这是存储桶的默认存储区域。在本例中,我们将使用美国西部(Oregon)地区。

上传文件

上传文件非常简单,只需调用 put_object 方法即可。以下是一个示例,其中将上传名为 example.jpg 的本地文件到名为 mybucket 的 S3 存储桶中:

# 上传文件到 S3
s3.upload_file('example.jpg', 'mybucket', 'example.jpg')

在实际应用中,可能需要指定其他选项,例如公共访问、用于缩放/裁剪的预览、元数据等。SDK 提供了相应选项,可以按需添加。

高级选项
分段上传

对于大型文件(大于5GB),AWS S3 提供了分段上传(Multipart Upload)功能。这可以让我们将文件分割成较小的部分,以便更高效地传输和处理。以下是一个示例,其中将使用分段上传将名为 largefile.zip 的本地文件上传到名为 mybucket 的 S3 存储桶中:

# 分段上传文件到 S3
from boto3.s3.transfer import TransferConfig

file_path = 'largefile.zip'
bucket_name = 'mybucket'
object_key = 'largefile.zip'

# 配置分段上传参数
config = TransferConfig(multipart_threshold=1024 * 25, max_concurrency=10,
                        multipart_chunksize=1024 * 25, use_threads=True)

# 启动分段上传
s3 = boto3.client('s3', region_name='us-west-2', aws_access_key_id=ACCESS_KEY,
                  aws_secret_access_key=SECRET_KEY)
s3.upload_file(file_path, bucket_name, object_key, Config=config)

TransferConfig 中,可以指定以下选项:

  • multipart_threshold:使用分段上传的文件大小的阈值,单位为字节。如果文件大小小于此值,则直接上传整个文件,不使用分段上传。默认为 8MB。
  • max_concurrency:同时上传分段的最大并发数。默认为 10。
  • multipart_chunksize:每个分段上传的大小,单位为字节。默认为 8MB。必须为5MB到50GB之间的5MB的倍数。
  • use_threads:上传是否使用线程。默认为 True。
目录上传

如果需要上传整个目录,可以使用以下代码:

import os

def upload_directory(path, bucket, prefix=''):
    for root, dirs, files in os.walk(path):
        for file in files:
            local_path = os.path.join(root, file)
            relative_path = os.path.relpath(local_path, path)
            s3_path = os.path.join(prefix, relative_path).replace('\\', '/')
            s3.upload_file(local_path, bucket, s3_path)

upload_directory('my_directory', 'mybucket', 'my_prefix')

在本例中,使用 os.walk 遍历本地目录,并将每个文件上传到 S3 中。URI 的前缀可以指定为 prefix

结论

本文介绍了如何使用 Python 和 Boto3 将文件上传到 AWS S3。您可以使用基本的 upload_file 方法进行简单的上传,或使用高级选项,例如分段上传和目录上传。AWS S3 将帮助您轻松管理任意数量和类型的数据,并为您的应用程序提供持久的、高可用的存储。