2015-12-16 1 views
2

Essayé ceci:Terminez un multipart_upload avec 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') 

Résultat: 5.9 fichier concert sur s3. Ne semble pas contenir plusieurs parties. J'ai trouvé this example, mais part n'est pas défini.

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) 

Question: Est-ce que quelqu'un sait comment utiliser le téléchargement multipart avec boto3?

+0

juste vu votre question lorsque vous cherchez un autre sujet, vous voudrez peut-être jeter un oeil à s3. transfert qui semble gérer automatiquement le multipart: http://boto3.readthedocs.org/en/latest/_modules/boto3/s3/transfer.html. (Jamais testé si). Notez également que lorsque vous utilisez multipart, vous ne verrez pas plusieurs parties sur S3 mais un seul fichier. Conformément à la documentation AWS: Une fois toutes les parties de votre objet téléchargées, Amazon S3 assemble ces pièces et crée l'objet – Tom

+1

@Tom Plus tôt, en utilisant boto2x, nous avons pu définir chunk_size mais avec boto3 nous n'avons aucune option pour définir chunk_size. Je pense qu'il en parle. http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.create_multipart_upload –

Répondre

1

Dans votre extrait de code, il devrait être clairement part ->part1 dans le dictionnaire. Typiquement, vous auriez plusieurs parties (sinon pourquoi utiliser le téléchargement en plusieurs parties), et la liste 'Parts' contiendrait un élément pour chaque partie.

Vous pouvez également être intéressé par la nouvelle interface pythonique pour traiter S3: http://s3fs.readthedocs.org/en/latest/

2

Je vous conseille d'utiliser boto3.s3.transfer à cet effet. Voici un exemple:

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

Pourquoi ne pas utiliser uniquement l'option de copie dans boto3?

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

Il y a des détails sur la façon d'initialiser l'objet s3 et évidemment d'autres options pour l'appel ici boto3 docs