2012-08-10 14 views
10

Ho scoperto come utilizzare PIL per ottenere le dimensioni dell'immagine, ma non le dimensioni del file in byte. Devo conoscere la dimensione del file per decidere se il file è troppo grande per essere caricato nel database.Come ottenere la dimensione dell'immagine (byte) utilizzando il PIL

+1

Stai generando un'immagine, o l'immagine è memorizzata su disco? –

+2

Utilizzare l'API del filesystem per ottenere le dimensioni del file, non PIL. – wberry

+1

o 'len()', se ce l'hai in memoria e non sul filesystem (che sembra probabile se stai memorizzando come BLOB in un database.) – geoffspear

risposta

14

Prova:

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

c'è ora modo di utilizzare PIL stesso? –

+3

Perché dovresti usare PIL? – thebjorn

+0

per controllare se un'immagine non è un'intestazione di immagine falsa, per creare un profilo di caricamento e quindi memorizzarlo nel database, quindi è ovvio creare un metodo in PIL per ottenere la dimensione in byte no? –

5

Sono un po 'tardi per questo, ma mi sono imbattuto in questa domanda 5 minuti fa, quando la ricerca come ottenere le dimensioni di un'immagine PIL senza salvarlo su disco. Nel caso in cui nessun altro si imbatte in questo, questo è un modo semplice per farlo:

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

Se hai già l'immagine sul filesystem:

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

Se, invece, si desidera ottenere il dimensione salvata un'immagine che è in memoria e non è stato salvato nel file system:

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

Questo metodo eviterà più letture dei dati di immagine come con StringIO. Si noti, tuttavia, che utilizzerà più RAM. Tutto è un compromesso. :-)

Edit: Ho appena visto questo commento dalla OP:

infine, il problema è dall 'inizio, se qualcuno si caricare una foto che hanno 1 giga (forgiato uno) ha' ucciderò il server prima che il PIL faccia il suo lavoro, quindi devo bloccare la richiesta prima che finisca!

Questa è una domanda molto diversa, ed è probabilmente la migliore realizzata sul server web. Per nginx, puoi aggiungerlo alla tua configurazione:

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

Il metodo 'BytesIO' sembra sottostimare le dimensioni rispetto alla dimensione della scrivania. Qualche idea del perché? – getup8