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
risposta
Prova:
import os
print os.stat('somefile.ext').st_size
c'è ora modo di utilizzare PIL stesso? –
Perché dovresti usare PIL? – thebjorn
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? –
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)
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
#...
}
Il metodo 'BytesIO' sembra sottostimare le dimensioni rispetto alla dimensione della scrivania. Qualche idea del perché? – getup8
Stai generando un'immagine, o l'immagine è memorizzata su disco? –
Utilizzare l'API del filesystem per ottenere le dimensioni del file, non PIL. – wberry
o 'len()', se ce l'hai in memoria e non sul filesystem (che sembra probabile se stai memorizzando come BLOB in un database.) – geoffspear