当前位置: 首页 > 知识库问答 >
问题:

用boto3完成multipart_upload?

危寒
2023-03-14

我试过这个:

import boto3
from boto3.s3.transfer import TransferConfig, S3Transfer
path = "/temp/"
fileName = "bigFile.gz" # this happens to be a 5.9 Gig file
client = boto3.client('s3', region)
config = TransferConfig(
    multipart_threshold=4*1024, # number of bytes
    max_concurrency=10,
    num_download_attempts=10,
)
transfer = S3Transfer(client, config)
transfer.upload_file(path+fileName, 'bucket', 'key')

结果:s3上的5.9 gig文件。似乎不包含多个部分。

我找到了这个示例,但是没有定义部分。

import boto3

bucket = 'bucket'
path = "/temp/"
fileName = "bigFile.gz"
key = 'key'

s3 = boto3.client('s3')

# Initiate the multipart upload and send the part(s)
mpu = s3.create_multipart_upload(Bucket=bucket, Key=key)
with open(path+fileName,'rb') as data:
    part1 = s3.upload_part(Bucket=bucket
                           , Key=key
                           , PartNumber=1
                           , UploadId=mpu['UploadId']
                           , Body=data)

# Next, we need to gather information about each part to complete
# the upload. Needed are the part number and ETag.
part_info = {
    'Parts': [
        {
            'PartNumber': 1,
            'ETag': part['ETag']
        }
    ]
}

# Now the upload works!
s3.complete_multipart_upload(Bucket=bucket
                             , Key=key
                             , UploadId=mpu['UploadId']
                             , MultipartUpload=part_info)

问题:有人知道如何使用boto3的多部分上传吗?


共有3个答案

梅飞宇
2023-03-14

如官方boto3文件所述:

AWS SDK for Python自动管理重试以及多部分和非多部分传输。

管理操作通过使用合理的默认设置来执行,这些设置非常适合大多数场景。

因此,您所需要做的就是设置所需的多部分阈值,该阈值将指示Python SDK将自动处理多部分上传的最小文件大小:

import boto3
from boto3.s3.transfer import TransferConfig

# Set the desired multipart threshold value (5GB)
GB = 1024 ** 3
config = TransferConfig(multipart_threshold=5*GB)

# Perform the transfer
s3 = boto3.client('s3')
s3.upload_file('FILE_NAME', 'BUCKET_NAME', 'OBJECT_NAME', Config=config)

此外,您还可以通过设置max_concurrency来使用多线程机制进行多部分上传:

# To consume less downstream bandwidth, decrease the maximum concurrency
config = TransferConfig(max_concurrency=5)

# Download an S3 object
s3 = boto3.client('s3')
s3.download_file('BUCKET_NAME', 'OBJECT_NAME', 'FILE_NAME', Config=config)

最后,如果你想在单线程中执行多部分上传,只需设置use_threads=False

# Disable thread use/transfer concurrency
config = TransferConfig(use_threads=False)

s3 = boto3.client('s3')
s3.download_file('BUCKET_NAME', 'OBJECT_NAME', 'FILE_NAME', Config=config)

完整的源代码和解释:Python S3多部分文件上载,带有元数据和进度指示器

燕野
2023-03-14

你的代码已经正确了。实际上,一个多部分上传的最小示例如下所示:

import boto3
s3 = boto3.client('s3')
s3.upload_file('my_big_local_file.txt', 'some_bucket', 'some_key')

您不需要显式地请求多部分上传,也不需要使用boto3中与多部分上传相关的任何低级函数。只需调用upload_file,如果您的文件大小超过某个阈值(默认值为8MB),boto3将自动使用多部分上传。

S3的最终结果显然不是由多个部分组成,这一事实似乎让您感到困惑:

结果:s3上的5.9 gig文件。似乎不包含多个部分。

... 但这是预期的结果。MultipartUpload API的全部要点是允许您通过多个HTTP请求上载单个文件,并最终在S3中使用单个对象。

蒯慈
2023-03-14

我建议您为此使用bot3.s3.transfer。以下是一个例子:

import boto3


def upload_file(filename):
    session = boto3.Session()
    s3_client = session.client("s3")

    try:
        print("Uploading file: {}".format(filename))

        tc = boto3.s3.transfer.TransferConfig()
        t = boto3.s3.transfer.S3Transfer(client=s3_client, config=tc)

        t.upload_file(filename, "my-bucket-name", "name-in-s3.dat")

    except Exception as e:
        print("Error uploading: {}".format(e))
 类似资料:
  • 我的表大约是220mb,里面有250k记录。我试图将所有这些数据拉入Python。我意识到这需要一个大块的批处理过程,并循环通过,但我不确定如何设置批处理,以开始前一个离开。 有什么方法可以过滤我的扫描吗?据我所知,过滤是在加载后发生的,加载在1mb时停止,因此我实际上无法扫描新对象。 任何协助都将不胜感激。

  • Boto3 - The AWS SDK for Python Boto3 is the Amazon Web Services (AWS) Software Development Kit (SDK) forPython, which allows Python developers to write software that makes useof services like Amazon S

  • 本文向大家介绍用Javascript完成图类,包括了用Javascript完成图类的使用技巧和注意事项,需要的朋友参考一下 在此代码中已注释掉的功能。您也可以切换到那些。我们还将Queue,Stack和PriorityQueue类移到了可以使用import语句或require调用导入的不同模块中。这是Graph类的完整实现-  示例

  • 问题内容: 如何快速执行Firebase的完成侦听器?它说文档中有SetValue和UpdateValue的完成列表,但没有示例。 问题答案: setValue的完成在{}块(关闭)中处理。因此,一旦尝试设置setValue,该块中的代码就会执行。如果没有错误,错误将为nil,快照将是已写入的数据。 给出结果 并打印“完成”

  • 问题内容: 我正在尝试实现自动补全功能,但是找不到在Swift中可用的示例。下面,我打算转换Ray Wenderlich的自动完成教程 和2010年的示例代码。最后,代码进行了编译,但是没有显示包含可能完成的表格,而且我没有经验来了解为什么它未被隐藏shouldChangeCharactersInRange。 问题答案: 用下面的内容替换您的函数内容。希望对您有帮助。

  • 我有一个用例,我使用lambda函数生成有符号的网址上传到S3桶,我还在生成有符号的网址时设置了元数据值,我的boto3版本是boto3==1.18.35。以前,当我生成有符号的网址上传到桶时,网址看起来像这样: https://bucket-name.s3.amazonaws.com/scanned-file-list/cf389880-09ff-4301-8fa7-b4054941685b/6