2011-03-15 10 views
31

Il doit y avoir un moyen facile d'obtenir la taille du fichier (taille de la clé) sans tirer sur un fichier entier. Je peux le voir dans les propriétés du navigateur AWS S3. Et je pense que je peux l'enlever de l'en-tête "Content-length" d'une demande "HEAD". Mais je ne relie pas les points sur la façon de le faire avec boto. Félicitations supplémentaires si vous postez un lien vers des exemples plus complets que dans le standard boto docs.Comment obtenir le fichier/taille de clé dans boto S3?

EDIT: Donc, ce qui suit semble faire l'affaire (bien que de regarder le code source, je ne suis pas complètement sûr.):

bk = conn.get_bucket('my_bucket_name') 
ky = boto.s3.key.Key(bk) 
ky.open_read() ## This sends a GET request. 
print ky.size 

Pour l'instant, je vais laisser la question ouverte pour commentaires, mieux solutions ou des pointeurs vers des exemples.

Répondre

56

Cela fonctionnerait:

bk = conn.get_bucket('my_bucket_name') 
key = bk.lookup('my_key_name') 
print key.size 

La méthode de recherche ne simplement une requête HEAD sur le seau pour le keyname il retournera tous les en-têtes (y compris la longueur de contenu) pour la clé, mais ne sera pas transféré tout le contenu réel de la clé.

Le S3 tutoria l mentionne ceci mais pas très explicitement et pas dans ce contexte précis. Je vais ajouter une section à ce sujet pour faciliter la recherche.

Note: pour chaque ancien lien comme http://boto.cloudhackers.com/s3_tut.html qui retourne une 404, ajouter à "/en/latest" juste après la ".com": http://boto.cloudhackers.com/en/latest/s3_tut.html. (Quelqu'un a besoin d'explorer mod_rewrite ...)

+2

Merci pour la réponse et le développement Boto en premier lieu. J'arracherais mes cheveux sans ça. – mjhm

+9

De nouveaux documents recommandent d'utiliser bk.get_key au lieu de bk.lookup – DanJ

+1

Je vous recommande également de vérifier "si la clé est None" en premier. – meawoppl

7

dans boto3:

s3.head_object effectue également une requête HEAD pour récupérer les méta-données sur l'objet:

s3 = boto3.client('s3') 
response = s3.head_object(Bucket='bucketname', Key='keyname') 
size = response['ContentLength'] 
Questions connexes