Wie überprüfe ich eine hochgeladene Datei, ob es ein Bild oder eine andere Datei ist?
In meinem web-Anwendung habe ich ein Bild-Upload-Modul. Ich möchte überprüfen Sie die hochgeladene Datei, ob es eine image-Datei oder eine andere Datei. Ich bin mit Java in server side.
Dem Bild ist zu Lesen als BufferedImage
in java und dann Schreibe ich es auf die Festplatte mit ImageIO.write()
Wie soll ich überprüfen Sie die BufferedImage
, ob es wirklich ein Bild oder etwas anderes?
Irgendwelche Vorschläge oder links wäre sehr hilfreich.
Kommentar zu dem Problem
Ihre beste Wette ist, um den Blick auf die Datei-Erweiterung, es gibt keine 100% Methode, um zu bestimmen, ob eine Datei ein Bild ist oder nicht.
InformationsquelleAutor der Frage | 2010-11-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gehe ich davon aus, dass Sie dies in einem servlet-Kontext. Wenn Sie erschwinglich ist, überprüfen Sie den content-type anhand der Dateiendung, dann verwenden Sie
ServletContext#getMimeType()
um den mime-type (content-type). Nur überprüfen, wenn es startet mitimage/
.Den Standard-mime-Typen sind definiert in der
web.xml
von der servletcontainer in Frage. Zum Beispiel Tomcat, er befindet sich in/conf/web.xml
. Sie können erweitern/überschreiben Sie es in der/WEB-INF/web.xml
Ihrer webapp wie folgt:Aber das hindert Sie nicht daran, Benutzer, die führen Sie durch ändern der Dateierweiterung. Wenn Sie möchten, um zu decken, dann können Sie auch prüfen Sie den mime-Typ basierend auf der tatsächlichen Inhalt einer Datei. Wenn es erschwinglich zu überprüfen, nur für BMP -, GIF -, JPG-oder PNG-Arten (aber nicht TIF, PSD, SVG, etc), dann kann man nur füttern, es direkt zu
ImageIO#read()
und prüfen, ob es nicht eine Ausnahme werfen.Aber wenn Sie möchten, um zu decken, die mehr Bildformate, wie gut, dann erwägen Sie die Verwendung einer 3rd-party-Bibliothek, die alle die Arbeit von sniffing die Datei-Header. Zum Beispiel JMimeMagic oder Apache Tika unterstützen sowohl die BMP -, GIF -, JPG -, PNG -, TIF-und PSD (aber nicht SVG). Apache Batik unterstützt SVG. Beispiel unten verwendet JMimeMagic:
Könntest du, wenn nötig, verwenden Sie Kombinationen und überwiegen der einen und der anderen.
Dieser sagte, müssen Sie nicht unbedingt
ImageIO#write()
zum speichern der hochgeladenen Bild auf der Festplatte. Nur schriftlich, die erhaltenenInputStream
direkt zu einemPath
oder jedeOutputStream
wieFileOutputStream
den üblichen Java-IO-Art ist mehr als ausreichend (siehe auch Empfohlene Methode zum speichern der hochgeladenen Dateien in einem servlet-Anwendung):Es sei denn, Sie möchten, um zu sammeln, ein Bild, Informationen wie Ihren Abmessungen und/oder möchten es Bearbeiten (zuschneiden/Größe ändern/drehen/konvertieren/etc) natürlich.
InformationsquelleAutor der Antwort BalusC
Ich verwendet org.apache.Unterhaus.imaging.Imaging in meinem Fall. Unten ist ein Beispiel code um zu überprüfen ob ein Bild ein jpeg-Bild oder nicht. Es wirft ImageReadException wenn die hochgeladene Datei ist kein Bild.
InformationsquelleAutor der Antwort gagan bopanna
Dies ist in der JDK und erfordert lediglich einen stream mit Unterstützung für
InformationsquelleAutor der Antwort gcstang