如何使用 Python 中的 Boto3 库使用 AWS 资源上传 S3 中的对象?

问题陈述- 使用 Python 中的 Boto3 库将对象上传到 S3。比如如何上传test.zip到S3的Bucket_1。

解决这个问题的方法/算法

步骤 1 - 导入 boto3 和 botocore 异常以处理异常。

步骤 2 - 从pathlib,导入 PurePosixPath 以从路径检索文件名

步骤 3 - s3_path和filepath是函数upload_object_into_s3中的两个参数

步骤4 -验证s3_path在AWS格式通过如S3:// BUCKET_NAME /键和文件路径为本地路径C://用户/文件名

步骤 5 - 使用 boto3 库创建 AWS 会话。

步骤 6 - 为 S3 创建 AWS 资源。

Step 7 - 拆分 S3 路径并执行操作以分离根存储桶名称和密钥路径

步骤 8 - 获取完整文件路径的文件名并添加到 S3 密钥路径中。

第 9 步- 现在使用函数upload_fileobj将本地文件上传到 S3。

步骤 10 - 使用函数wait_until_exists等待操作完成。

步骤 11 - 根据响应代码处理异常以验证文件是否已上传。

第 12 步- 如果上传文件时出现问题,处理通用异常

示例

使用以下代码将文件上传到 AWS S3 -

import boto3

frombotocore.exceptionsimport ClientError

from pathlib import PurePosixPath

def upload_object_into_s3(s3_path, filepath):

   if 's3://' in filepath:

      print('SourcePath is not a valid path.' + filepath)

      raise Exception('SourcePath is not a valid path.')

   elif s3_path.find('s3://') == -1:

      print('DestinationPath is not a s3 path.' + s3_path)

      raise Exception('DestinationPath is not a valid path.')

   session = boto3.session.Session()

   s3_resource = session.resource('s3')

   tokens = s3_path.split('/')

   target_key = ""

   if len(tokens) > 3:

      for tokn in range(3, len(tokens)):

         if tokn == 3:

            target_key += tokens[tokn]

         else:

            target_key += "/" + tokens[tokn]

   target_bucket_name = tokens[2]

   file_name = PurePosixPath(filepath).name

   if target_key != '':

      target_key.strip()

      key_path = target_key + "/" + file_name

   else:

      key_path = file_name

   print(("key_path: " + key_path, 'target_bucket: ' + target_bucket_name))

   try:

      # 从本地路径上传实体

      with open(filepath, "rb") as file:

      s3_resource.meta.client.upload_fileobj(file, target_bucket_name, key_path)

      try:

         s3_resource.Object(target_bucket_name, key_path).wait_until_exists()

         file.close()

      except ClientError as error:

         error_code = int(error.response['Error']['Code'])

         if error_code == 412 or error_code == 304:

            print("Object didn't Upload Successfully ", target_bucket_name)

            raise error

      return "Object Uploaded Successfully"

   except Exception as error:

      print("s3 helper 上传对象函数出错: " + error.__str__())

      raise error

print(upload_object_into_s3('s3://Bucket_1/testfolder', 'c://test.zip'))

输出结果
key_path:/testfolder/test.zip, target_bucket: Bucket_1

Object Uploaded Successfully

以上是 如何使用 Python 中的 Boto3 库使用 AWS 资源上传 S3 中的对象? 的全部内容, 来源链接: utcz.com/z/347585.html

回到顶部