2011-03-15 8 views
31

Debe haber una manera fácil de obtener el tamaño de archivo (tamaño de clave) sin tener que pasar un archivo completo. Puedo verlo en las Propiedades del navegador AWS S3. Y creo que puedo sacarlo del encabezado "Content-length" de una solicitud "HEAD". Pero no estoy conectando los puntos sobre cómo hacer esto con boto. Felicitaciones extra si publica un enlace a algunos ejemplos más completos que están en el standard boto docs.¿Cómo obtengo el tamaño del archivo/clave en el boto S3?

EDIT: Entonces, la siguiente parece hacer el truco (aunque de mirar el código fuente no estoy completamente seguro.):

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

Por ahora voy a dejar la pregunta abierta para comentarios, mejor soluciones o punteros a ejemplos.

Respuesta

56

Esto funcionaría:

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

El método de búsqueda simplemente hace una petición HEAD en el cubo para el nombre de clave por lo que implica que todos los encabezados (incluyendo el contenido de longitud) para la llave pero no transferirá cualquiera del contenido real de la clave.

El S3 tutoria lo menciono pero no muy explícitamente y no en este contexto exacto. Agregaré una sección sobre esto para ayudar a que sea más fácil de encontrar.

Nota: para todos los eslabones de edad como http://boto.cloudhackers.com/s3_tut.html que devuelve un 404, poner en "/en/latest" justo después de la ".com": http://boto.cloudhackers.com/en/latest/s3_tut.html. (Alguien tiene que explorar mod_rewrite ...)

+2

Gracias por la respuesta y el desarrollo Boto en primer lugar. Me estaría arrancando el pelo sin eso. – mjhm

+9

Nuevos documentos recomiendan usar bk.get_key en lugar de bk.lookup – DanJ

+1

También recomendaría verificar primero "si la clave es None". – meawoppl

7

en boto3:

s3.head_object también realiza una petición HEAD para recuperar los metadatos acerca del objeto:

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