![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Projektleiter
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.141
|
Ich stehe gerade vor dem Problem, dass ich ein Verzeichnis durchwühle und alle Eintrage, die mir zurückgeliefert werden möchte ich nun prüfen, ob es sich dabei um ein Bild handelt.
Konkret interessieren mich nur jpeg, gif und png. Klar, ich könnte die Dateiendung überprüfen, aber das ist die eher unschöne Variante. Die Dimensionen muss ich eh auslesen. Also kommt mir getimagesize() gerade recht. Das ist soweit auch ok, wenn es ein Bild ist, aber wie kann ich Fehlermeldungen sinnvoll abfangen, wenn getimagesize() sich an einem Verzeichnis oder einer Word-Datei versucht? Das @ zur Fehlerunterdrückung betrachte ich mal als Fusch. Ich bräuchte quasi eine Funktion á la function is_ein_bild($datei) { code {} //--> ja: return true; //--> nein: return false; } Jemand eine Idee? |
|
|
|
|
|
Nach oben #2 |
|
Semantic Web Fanatic
Registriert seit: 03.06.2006
Beiträge: 236
|
Also Ordner kannst du ja per is_file ausschließen.
Aber um ein @getimagesize wirst du denke ich nicht herumkommen.
__________________
Applikations-Programmierung: BlitzMax, BlitzPlus Webentwicklung: PHP, (X)HTML, CSS, JavaScript, MySQL |
|
|
|
|
|
Nach oben #4 |
|
Erfahrener Benutzer
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 621
|
Also bei mir gibt die Funktion bei Dateien mit anderem Format keinen Fehler aus, das Array bleibt jedoch leer. Ergo:
PHP-Code:
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
|
|
|
|
|
Nach oben #6 |
|
Erfahrener Benutzer
Registriert seit: 05.01.2006
Ort: Düsseldorf
Beiträge: 168
|
Fileinfo wäre die bessere Alternative. Der Nachteil ist nur, dass es über PECL
nachträglich installiert werden muss. |
|
|
|
|
|
Nach oben #7 |
|
Erfahrener Benutzer
Registriert seit: 18.03.2005
Beiträge: 576
|
Mal abgesehen davon, dass is_file oder getimagesize nicht gerade die schnellsten Funktionen sind, würde ich nur @getimagesize bevorzugen.
is_file und getimagesize bedeutet auch doppeltes auslesen einer Datei. |
|
|
|
|
|
Nach oben #8 | |
|
Erfahrener Benutzer
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 756
|
is_file() liest doch nicht die Datei aus und zum Rückgabewert lese ich u.A. folgendes in der Doku:
Zitat:
if (count($…-) > 0) ist demnach nicht ausreichend. Basti Geändert von Basti (08.09.2007 um 20:37 Uhr). |
|
|
|
|
|
|
Nach oben #10 |
|
Projektleiter
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.141
|
also so?
PHP-Code:
mal von der Diskussion um is_file() abgesehen... |
|
|
|
|
|
Nach oben #11 | |
|
Erfahrener Benutzer
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 756
|
PHP-Code:
Zitat:
Basti Geändert von Basti (08.09.2007 um 21:48 Uhr). |
|
|
|
|
|
|
Nach oben #13 |
|
Erfahrener Benutzer
Registriert seit: 18.03.2005
Beiträge: 576
|
Naja bei GetImageSize liest ja nur den Header der Datei ein, und dort stehen ja schon alle Angaben zum Bild. Und wenn diese gar nicht erst vorhanden sind, kann es auch kein Bild sein -> logisch.
Bei is_file könnte man alles Mögliche uploaden, weil alles irgendwie ein File ist, ergibt aber hier keinen Sinn, wenn man gezielt nach Bildern abfragen will. Also kann man gleich diesen Punkt überspringen, Zeit einsparen und gleich zu GetImageSize gehen. Und mit is_readable wird es ja noch interessanter: is_file: Datei öffenen und schauen ob es eine Datei ist. is_readable: Datei noch mal öffnen, ob sie lesbar ist: getimagesize: Datei zum dritten mal öffnen, ob es ein Bild ist. Najaaaaaaaaaaaaa ... is_file und is_readable ist in getimagesize bereits schon eingebaut Denn wenn getimagesize auf etwas zugreiffen soll, was nicht vorhanden ist, gibt es auch auch eine Fehlermeldung bzw: http://www.php.net/manual/en/function.getimagesize.php |
|
|
|
|
|
Nach oben #14 |
|
Erfahrener Benutzer
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 621
|
@CIX: is_file() liest nicht die Datei ein, es überprüft lediglich, ob der Pfad, den man angibt eine Datei ist. Ist es keine Datei (sondern z.B. ein Ordner), wird FALSE zurückgegeben, aber es wird nicht die ganze Datei eingelesen, das ist Quatsch! Im Dateisystem steht fest, was ein Ordner und was eine Datei ist, entsprechend wird nur diese Information ausgegeben.
Ich habe die Funktion deswegen gewählt, weil JH ein @ umgehen will. Mit is_file() prüfe ich also, ob es sich überhaupt erstmal um eine Datei handelt, mit is_readable() prüfe ich, ob diese Datei überhaupt gelesen werden kann (bis zu diesem Zeitpunkt ist der Inhalt noch nicht ein einziges Mal angefasst worden) und dann erst greife ich auf den Inhalt mittels getimagesize() zu. OK, wie das mit anderen Bildern usw. aussieht weiß ich nicht genau, die Dateiformate, die ich getestet hatte, gaben alle ein leeres Array zurück.
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
|
|
|
|
|
Nach oben #15 |
|
Erfahrener Benutzer
Registriert seit: 18.03.2005
Beiträge: 576
|
Aber letztlich ist es dennoch Blödsinn, weil GetImageSize dann schon hängen bleibt, wenn die Datei in wirklichkeit ein Ordner ist, oder wenn diese Datei nicht lesbar ist. Und diese liest auch nicht die komplette Datei ein, sondern nur den Header (interne funktion gfxinfo).
Warum also der Umweg über zusätzliche Funktionen ? Machst du das immer so umständlich ? GetImageSize soll ja letztlich nur auf eine Bilddatei zugreiffen oder sehe ich das falsch. |
|
|
|
|
|
Nach oben #16 |
|
Erfahrener Benutzer
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 621
|
@CIX: Ich sehe es nicht als überflüssig, sondern als sauber an, aber das ist jedem selbst überlassen. getimagesize() greift vielleicht nur auf den Header zu, aber die anderen Funktionen bedienen sich der Informationen aus dem Dateisystem und fassen die Datei garnicht an bzw. dessen Inhalt. Ergo: Bei Dateien ohne Leseberechtigung oder Verzeichnissen ist diese Methode sehr wahrscheinlich performanter.
__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
|
|
|
|
|
Nach oben #17 | |
|
Erfahrener Benutzer
Registriert seit: 18.03.2005
Beiträge: 576
|
Für eine Bildergalerie habe ich einen Bildcleaner geschrieben.
Dieser macht nichts anderes als den Upload-Order zu durchsuchen (mit glob), und die Bilder mit den Einträgen in der DB zu vergleichen. Soweit dazu ... aber da ich ja gezielt auf Bilder zugreifen möchte, interessiert es mich wenig ob dort ein Verzeichnis ist oder nicht. Auch die Frage der Leseberechtigung steht gar nicht im Raum, sonst könnten die User die Bilder gar nicht sehen Fazit: Also brauch ich nur die Bilder prüfen, und dazu reicht getimagesize völlig aus. getimagesize() arbeitet intern auch mit den anderen File-Funktionen in PHP, und da getimagesize versucht die jeweilige Datei zu öffnen bleibt getimagesize sofort hängen wenn die Datei durch etwas bklockiert wird, und das bevor die Datei überhaupt eingelesen werden kann. Also intern sind Funktionen wie is_file() etc.. schon eingebaut. => siehe Sourcecode von PHP Ganz klar muss man aber auch erwähnen das getimagesize auf HTTP-Zugriffe langsamer ist als auf direkte Pfadangaben (z.B. var/html/www/....). Mit getimagesize habe ich mich schon genug auf anderen größeren Portalen rumschlagen müssen, dadurch ist mir die Funktionsweise durchaus bekannt. Und dort wurden Millionen von Bilder mit getimagesize geprüft. Aber um wieder den Bogen zu eigentlichen Thema zu finden: Zitat:
|
|
|
|
|
|
|
Nach oben #18 | ||
|
Projektleiter
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.141
|
Zitat:
Verzeichnisse, Word-Dateien, Jpeg und symlinks... whatever. Es interessieren davon aber nur die JPEG, PNG und GIF. |
||