it-swarm.com.ru

Завершить multipart_upload с помощью boto3?

Пробовал это: 

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')

Результат: файл 5,9 гига на с3. Кажется, не содержит несколько частей.

Я нашел этот пример , но part не определен. 

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?

7
blehman

Я бы посоветовал вам использовать boto3.s3.transfer для этой цели. Вот пример:

import boto3

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

    try:
        print "Uploading file:", 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: %s" % ( e )
4
deadcode

Почему бы не использовать опцию копирования в boto3?

s3.copy(CopySource={
        'Bucket': sourceBucket,
        'Key': sourceKey}, 
    Bucket=targetBucket,
    Key=targetKey,
    ExtraArgs={'ACL': 'bucket-owner-full-control'})

Подробная информация о том, как инициализировать объект s3, и, очевидно, дополнительные опции для вызова, доступны здесь boto3 docs .

3
Gourav Sengupta

В вашем фрагменте кода явно должно быть part -> part1 в словаре. Как правило, у вас будет несколько частей (иначе зачем использовать загрузку из нескольких частей), а список 'Parts' будет содержать элемент для каждой части.

Вас также может заинтересовать новый интерфейс Pythonic для работы с S3: http://s3fs.readthedocs.org/en/latest/

1
mdurant