Comment puis-je copier des fichiers de plus de 5 Go dans Amazon S3?

la documentation de L'API REST D'Amazon S3 indique qu'il y a une limite de taille de 5 Go pour le téléchargement dans une opération de PUT. Les fichiers plus gros doivent être téléchargés en multipartie. Fin.

cependant, ce dont j'ai besoin en essence, c'est de renommer des fichiers qui pourraient être plus gros que ça. Autant que je sache, il n'y a pas de renommer ou de déplacer l'opération, j'ai donc copier le fichier vers le nouvel emplacement et supprimer l'ancien. Comment cela se fait-il avec des fichiers de plus de 5 Go? Je dois faire un multipart télécharger à partir de la seau à lui-même? Dans ce cas, comment la division du fichier en pièces fonctionne-t-elle?

D'après la lecture de la source de boto, il ne semble pas qu'il fasse quoi que ce soit de semblable automatiquement pour les fichiers de plus de 5 Go. Est-il intégré dans l'appui que j'ai raté?

22
demandé sur Pedro Werneck 2012-04-27 22:29:21

3 réponses

autant que je sache, il n'y a pas d'opération de changement de nom ou de déménagement, donc j'ai pour copier le fichier vers le nouvel emplacement et supprimer l'ancien.

c'est exact, c'est assez facile à faire pour les objets/fichiers inférieurs à 5 Go au moyen d'un METTRE l'Objet de Copie opération, suivie par un supprimer L'objet opération (les deux sont pris en charge dans boto bien sûr, voir copy_key () et delete_key ()):

cette implémentation de L'opération PUT crée une copie d'un objet C'est déjà stocké dans Amazon S3. Une opération de mise en copie est la même comme effectuer un GET et puis un PUT. L'ajout de l'en-tête de requête, x-amz-copy-source, rend l'opération PUT copy l'objet source le seau de destination.

cependant, ce n'est en effet pas possible pour les objets/fichiers de plus de 5 Go:

Remarque:

[...] Vous créez une copie de votre objet jusqu'à 5 GO en taille dans un seul atomique opération utilisant cette API. Cependant, pour copier un objet supérieur à 5 Go, vous devez utiliser l'API de téléchargement multipart. Pour conceptuelle information.[ ..], accédez à Téléchargement D'Objets À L'Aide De Plusieurs Parties De Téléchargement [...] [c'est moi qui souligne]

En attendant Boto soutient ceci aussi bien au moyen de la copy_part_from_key () méthode; malheureusement l'approche requise n'est pas documentée en dehors de latirez la demande n ° 425 (permettre la multi-commandes de copie) (je n'ai pas essayé moi-même mais tout de même):

import boto
s3 = boto.connect_s3('access', 'secret')
b = s3.get_bucket('destination_bucket')
mp = b.initiate_multipart_upload('tmp/large-copy-test.mp4')
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 1, 0, 999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 2, 1000000000, 1999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 3, 2000000000, 2999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 4, 3000000000, 3999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 5, 4000000000, 4999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 6, 5000000000, 5500345712)
mp.complete_upload()

vous pourriez vouloir étudier les échantillons respectifs sur la façon de réaliser ceci en Java ou .NET éventuellement, ce qui pourrait fournir plus d'informations sur l'approche générale, voir copier des objets en utilisant le multipart Upload API.

Bonne chance!


Annexe

s'il vous Plaît être conscient de ce qui suit particularité concernant la copie en général, ce qui est facilement négligés:

Lors de la copie d'un objet, vous pouvez conserver la plupart des métadonnées (par défaut) ou de spécifier de nouvelles métadonnées. cependant, la LCA n'est pas conservée et est privé de l'utilisateur qui fait la demande. Pour remplacer la paramètre ACL par défaut, utilisez le x-amz-acl-tête pour spécifier une nouvelle ACL lors de la génération d'une requête de copie. Pour en savoir plus, consultez Amazon S3 Les acl. [c'est moi qui souligne]

23
répondu Steffen Opel 2013-06-06 23:18:37

Le dessus a été très proche de travail, malheureusement, devrait avoir terminé avec mp.complete_upload() au lieu de la faute de frappe upload_complete()!

j'ai ajouté un script de copie multipart boto S3 qui fonctionne ici, basé sur L'exemple Java AWS et testé avec des fichiers de plus de 5 GiB:

https://gist.github.com/joshuadfranklin/5130355

10
répondu joshuadfranklin 2016-08-30 05:14:44

j'ai trouvé cette méthode pour télécharger des fichiers de plus de 5gigs et je l'ai modifiée pour travailler avec une procédure de copie Boto. voici l'original: http://boto.cloudhackers.com/en/latest/s3_tut.html

import math
from boto.s3.connection import S3Connection
from boto.exception import S3ResponseError


conn = S3Connection(host=[your_host], aws_access_key_id=[your_access_key],
                    aws_secret_access_key=[your_secret_access_key])

from_bucket = conn.get_bucket('your_from_bucket_name')
key = from_bucket.lookup('my_key_name')
dest_bucket = conn.get_bucket('your_to_bucket_name')

total_bytes = key.size
bytes_per_chunk = 500000000

chunks_count = int(math.ceil(total_bytes/float(bytes_per_chunk)))
file_upload = dest_bucket.initiate_multipart_upload(key.name)
for i in range(chunks_count):
    offset = i * bytes_per_chunk
    remaining_bytes = total_bytes - offset
    print(str(remaining_bytes))
    next_byte_chunk = min([bytes_per_chunk, remaining_bytes])
    part_number = i + 1
    file_upload.copy_part_from_key(dest_bucket.name, key.name, part_number,
                                   offset, offset + next_byte_chunk - 1)
file_upload.complete_upload()
0
répondu Matt Farguson 2017-05-24 18:27:24