Moin
Ich tüftel gerade an einem Programm welche u.a. automatisch Bilder aus dem Web runterlädt (ist alles legal). Allerdings würde ich gerne prüfen, ob die Datei, welche gerade runtergeladen wurde, auch wirklich ein Bild ist. Zur Zeit läuft das Programm so, dass nur Dateien mit einer JPG oder PNG Endung heruntergeladen werden. Mittels mimetypes überprüfe ich, ob die Datei eine Korrekte Endung hat. Allerdings wird anschließend nicht geprüft ob die Datei mit der JPG/PNG Endung auch wirklich ein Bild ist.
Wie kann ich das nun Prüfen? Ich hab mir gedacht, dass ich einfach das Bild mittels PIL öffnen könnte, und schauen könnte, ob PIL mir einen Fehler aufwirft. Aber ist das sicher?
Testen ob Datei wirklich ein Bild ist
- microkernel
- User
- Beiträge: 271
- Registriert: Mittwoch 10. Juni 2009, 17:27
- Wohnort: Frankfurt
- Kontaktdaten:
@darktrym: Ja aber eben nur Unix. Und unsicherer als tatsächlich zu versuchen die Bilddateien zu dekomprimieren ist es auch, denn ``file`` testet nur eine handvoll Bytes.
PIL ist aber weit davon entfernt alle relevanten Formate zu unterstützen, noch dazu crasht das gerne mal wenn ihm etwas nicht koscher vorkommt. Oft genug bei unvollständ. Dateien oder JPEG2000 gesehen.
Aber besser als nur die ersten paar Bytes zu lesen wie es file tut, wenn es auch nicht die performanteste und zuverlässigste Möglichkeit ist. File gibt natürlich auch für andere Plattformen.
Aber besser als nur die ersten paar Bytes zu lesen wie es file tut, wenn es auch nicht die performanteste und zuverlässigste Möglichkeit ist. File gibt natürlich auch für andere Plattformen.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Aber man will doch gerade testen ob es ein Bild ist, da ist der zusätzliche Check "kann man es laden" nen Vorteil gegenüber "Hat es nen PNG-Header" weil letzteres auch ein korruptes, halb heruntergeladenes Bild sein kann.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- microkernel
- User
- Beiträge: 271
- Registriert: Mittwoch 10. Juni 2009, 17:27
- Wohnort: Frankfurt
- Kontaktdaten:
Naja ich hab's jetzt folgendermaßen gelöst (Auszug aus meiner Klasse):
...nur für den Fall, dass ein anderer mal danach sucht.
Code: Alles auswählen
def is_valid(self):
if self.mimetype not in self.accepted_mimetypes:
return False
try:
image = Image.open(StringIO(self.binary))
image.verify()
except IOError:
return False
return True
Hallo auch,
prinzipiell ein gar nicht mal so schlechter Ansatz ... aus Performancegründen würde ich Dir jedoch die Ermittlung des Bildtyps über die Validierung des Dateiheaders empfehlen.
Im Netz findet man diesbezüglich ja wahnsinnig viele Infos. Falls es Dir interessiert: http://www.fastgraph.com/help/image_fil ... rmats.html
Aber warum das Rad neu erfinden, wenn bereits andere sich der Aufgabe gewidmet haben. So findest Du im Python Package Index bereits eine Bilbliothek, die das für dich erledigen kann: ImageLite
-Colin-
prinzipiell ein gar nicht mal so schlechter Ansatz ... aus Performancegründen würde ich Dir jedoch die Ermittlung des Bildtyps über die Validierung des Dateiheaders empfehlen.
Im Netz findet man diesbezüglich ja wahnsinnig viele Infos. Falls es Dir interessiert: http://www.fastgraph.com/help/image_fil ... rmats.html
Aber warum das Rad neu erfinden, wenn bereits andere sich der Aufgabe gewidmet haben. So findest Du im Python Package Index bereits eine Bilbliothek, die das für dich erledigen kann: ImageLite
-Colin-