2015-02-23 1 views
1

J'essaie de télécharger des objets (fichiers) à partir de Amazon-S3 mais le problème auquel je fais face est de garder la trace des objets qui ont été téléchargés car j'ai beaucoup d'objets dans chaque seau et ils augmentent avec chaque jour.Existe-t-il un moyen de télécharger des objets à partir d'Amazon S3 en fonction de certaines balises?

Je cherchais un moyen pour que je puisse set/unset une étiquette associée à chaque objet. Donc, quand je dois télécharger, je peux rechercher tous les objets qui n'ont pas ce tag particulier, les télécharger et ensuite définir leur tag afin qu'ils soient téléchargés à nouveau la prochaine fois. Y a-t-il un moyen de le faire? Un exemple d'exemple à faire sera utile. J'utilise boto pour télécharger les objets à travers python

Le code actuel que j'ai essentiellement télécharge un seul objet que je dois nommer.

from boto.s3.connection import S3Connection 

conn = S3Connection(S3 Credentials) 
bucket = conn.get_bucket (Bucket Name) 
key = bucket.get_key(Object Name) 
key.get_contents_to_filename(Local Object Path to Download) 

CODE MISE À JOUR: J'essaie de copier le fichier d'un répertoire à un autre dans le même seau à l'aide boto's fonction copy(). Voici mon code actuel:

conn = S3Connection(S3 Credentials) 
    bucket = conn.get_bucket (Bucket Name) 
    key = bucket.get_key(Object Name) 
    key2= bucket.get_key(/new/dir/in_same_bucket/) 
    key.get_contents_to_filename(Local Object Path to Download) 
    key.copy(bucket.name, key2.name,metadata=None, preserve_acl=True) 

Quand je fais ce que je reçois erreur AttributeError: 'NoneType' object has no attribute 'name'. Comment puis-je copier le fichier d'un répertoire à un autre dans le même compartiment en utilisant copy()?

Répondre

1

Vous pouvez attacher des métadonnées arbitraires à des objets S3 lorsque vous téléchargez l'objet de sorte que vous puissiez définir des balises lors du téléchargement initial des fichiers. Mais il y a encore deux problèmes à surmonter:

  • Désactiver les étiquettes. S3 ne fournit pas un moyen de modifier les métadonnées d'un objet après la création de l'objet. Il vous fournit cependant un moyen de COPIER l'objet sur lui-même (côté serveur) et de modifier les métadonnées. Donc, c'est un gros maladroit, mais vous pouvez désactiver les balises après avoir traité l'objet.
  • Recherche d'étiquettes. C'est le vrai problème. Il n'y a aucun moyen d'obtenir une liste de tous les objets dont les métadonnées contiennent (ou ne contiennent pas) une certaine valeur. Vous devriez constamment lister tous les objets dans le seau pour trouver les objets qui ont votre tag. Et, pour empirer les choses, les étiquettes ne seraient pas retournées dans la liste des citations. Vous devez faire une requête HEAD sur chaque objet pour récupérer ses tags.

Si tous les objets qui doivent être téléchargés peuvent être trouvés en fonction de leur LastModifiedDate vous pourriez potentiellement utiliser cela. Vous devez toujours lister tous les objets, mais la dernière date de modification est renvoyée dans les données de liste de compartiments. Aucune demande de HEAD n'est donc requise. Vous pouvez également utiliser un prefix pour trier vos objets. Vous pouvez télécharger tous les nouveaux objets dans le compartiment en utilisant un nom tel que new/mynewobject, puis obtenir une liste de tous les objets ayant prefix=new. Après avoir téléchargé l'objet, vous pouvez utiliser l'opération COPY pour "déplacer" l'objet hors du nouveau dossier afin de ne plus le traiter.

Ou vous pouvez utiliser une base de données comme DynamoDB pour vous aider à garder une trace des choses.

+0

Merci pour votre réponse. Pouvez-vous élaborer un peu l'approche 'LastModifiedDate' à travers un exemple? Est-il également possible de renommer un objet comme après le téléchargement de l'objet? Nous pouvons ajouter un préfixe au nom de l'objet pour qu'il apparaisse téléchargé? –

+0

J'ai fait quelques modifications à mon code ci-dessus. J'essayais de copier (déplacer) les fichiers d'un répertoire à un autre dans le même compartiment mais je reçois une erreur que j'ai mentionnée dans mon post ci-dessus –