2012-08-10 7 views
10

erhalten Ich habe herausgefunden, wie Sie PIL verwenden, um die Bildabmessungen zu erhalten, aber nicht die Dateigröße in Bytes. Ich muss die Dateigröße kennen, um zu entscheiden, ob die Datei zu groß ist, um in die Datenbank hochgeladen zu werden.Wie Bildgröße (Bytes) mit PIL

+1

Generieren Sie ein Bild, oder ist das Bild auf der Festplatte gespeichert? –

+2

Verwenden Sie die Dateisystem-API, um die Dateigröße zu erhalten, nicht PIL. – wberry

+1

oder 'len()', wenn Sie es im Speicher haben und nicht im Dateisystem (was wahrscheinlich ist, wenn Sie als BLOB in einer Datenbank speichern.) – geoffspear

Antwort

14

Versuchen:

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

gibt es jetzt Möglichkeit, PIL selbst zu verwenden? –

+3

Warum sollten Sie PIL verwenden? – thebjorn

+0

zu steuern, ob es ein Bild ist nicht ein gefälschter Image-Header, um ein Upload-Profil zu machen, und speichern Sie es dann in der Datenbank, so ist es offensichtlich, eine Methode in PIL zu machen, um die Größe in Bytes nicht zu bekommen? –

5

Ich bin ein bisschen spät, aber ich kam in dieser Frage 5 Minuten vor, wenn die Suche, wie die Größe eines PIL Bild zu erhalten, ohne sie auf die Festplatte zu speichern. Falls sich jemand anderes über diese kommt, ist dies eine einfache Art und Weise tun:

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

Wenn Sie bereits das Bild auf dem Dateisystem haben:

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

Wenn Sie jedoch wollen, dass die bekommen gespeichert Größe eines Bild, das im Speicher und wurde auf das Dateisystem nicht gespeichert:

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

Dieses Verfahren wird mehrere vermeiden liest die Bilddaten als mit StringIO. Beachten Sie jedoch, dass mehr RAM verwendet wird. Alles ist ein Kompromiss. :-)

Edit: Ich habe gerade gesehen, diesen Kommentar aus dem OP:

schließlich das Problem aus der beginnig ist, wenn jemand ein Bild hochladen, die mit 1 giga haben (eine geschmiedete) er‘ Ich werde den Server töten, bevor PIL seine Sachen macht, also muss ich die Anfrage blockieren, bevor sie fertig ist!

Dies ist eine ganz andere Frage, und ist wahrscheinlich am besten am Webserver durchgeführt. Für nginx können Sie dies zu Ihrer Konfiguration hinzufügen:

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

Die 'BytesIO' Methode scheint die Größe zu unterschätzen verglichen mit der Größe von Desk. Irgendeine Idee warum? – getup8