2012-08-10 20 views
10

Descubrí cómo usar PIL para obtener las dimensiones de la imagen, pero no el tamaño del archivo en bytes. Necesito saber el tamaño del archivo para decidir si el archivo es demasiado grande para cargarlo en la base de datos.Cómo obtener el tamaño de imagen (bytes) usando PIL

+1

¿Está generando una imagen o la imagen está almacenada en el disco? –

+2

Utilice la API del sistema de archivos para obtener el tamaño del archivo, no PIL. – wberry

+1

o 'len()', si lo tiene en la memoria y no en el sistema de archivos (lo que parece probable si está almacenando como un BLOB en una base de datos) – geoffspear

Respuesta

14

Probar:

import os 
print os.stat('somefile.ext').st_size 
+0

¿Hay ahora forma de usar el PIL? –

+3

¿Por qué necesitarías usar PIL? – thebjorn

+0

para controlar si es una imagen, no un encabezado de imagen forjado, para crear un perfil de carga, y luego almacenarlo en la base de datos, por lo que es obvio hacer un método en PIL para obtener el tamaño en bytes no? –

5

estoy un poco tarde para esto, pero me encontré con esta pregunta hace 5 minutos cuando se busca la manera de obtener el tamaño de una imagen PIL sin guardarlo en el disco. En el caso de cualquier otra persona se encuentra con esto, esta es una forma sencilla de hacerlo:

import StringIO 
output = StringIO.StringIO() 
image_output.save(output, 'PNG') #a format needs to be provided 
contents = output.getvalue() 
output.close() 

image_filesize = len(contents) 
5

Si ya tiene la imagen en el sistema de archivos:

import os 
os.path.getsize('path_to_file.jpg')` 

Sin embargo, si usted quiere conseguir la tamaño de salvado de una imagen que está en la memoria y no se ha guardado en el sistema de archivos:

from io import BytesIO 
img_file = BytesIO() 
image.save(img_file, 'png') 
image_file_size = img_file.tell() 

Este método evitará varias lecturas de los datos de imagen al igual que con StringIO. Sin embargo, tenga en cuenta que usará más RAM. Todo es una compensación. :-)

Editar: Acabo de ver este comentario de la OP:

finalmente, el problema es de la a principios, si alguien va a subir una foto que tiene 1 giga (forjado uno) que' Mataré el servidor antes de que PIL haga lo suyo, ¡así que debo bloquear la solicitud antes de que termine!

Esta es una pregunta muy diferente, y probablemente se realice mejor en el servidor web. Para nginx, puede agregar esto a su configuración:

http { 
    #... 
     client_max_body_size 100m; # or whatever size you want as your limit 
    #... 
} 
+0

El método 'BytesIO' parece subestimar el tamaño en comparación con obtener el tamaño del escritorio. ¿Alguna idea de por qué? – getup8

Cuestiones relacionadas