📅  最后修改于: 2023-12-03 15:09:37.521000             🧑  作者: Mango
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 和秘密访问密钥。
首先,我们需要引入 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_id
和 aws_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 将帮助您轻松管理任意数量和类型的数据,并为您的应用程序提供持久的、高可用的存储。