Portal > Foren > PHP > PHP-Programmierung > prüfen, ob eine Datei ein Bild ist
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 08.09.2007, 17:00 Nach oben    #1
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.378
Standard prüfen, ob eine Datei ein Bild ist

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?
Jann Hendrik ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.09.2007, 17:11 Nach oben    #2
Jonas
 
Benutzerbild von Artemis
 
Registriert seit: 03.06.2006
Beiträge: 244
Standard

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


Artemis ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.09.2007, 17:11 Nach oben    #3
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

Ich hätte es mit dem @ in Kombination mit getimagesize() gemacht.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.09.2007, 17:39 Nach oben    #4
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 688
Standard

Also bei mir gibt die Funktion bei Dateien mit anderem Format keinen Fehler aus, das Array bleibt jedoch leer. Ergo:

PHP-Code:
function checkIfImage ($stringFile)
{
  
$booleanReturnValue FALSE;

  if (
is_file ($stringFile) === TRUE
  
AND is_readable ($stringFile) === TRUE
      
)
  {
    
getimagesize ($stringFile,
                  
$arrayResult
                  
);

    if (
count ($arrayResult) > 0)
    {
      
$booleanReturnValue TRUE;
    }

    unset (
$stringFile,
           
$arrayResult
           
);
  }

  return 
$booleanReturnValue;

__________________
Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll
MrNiceGuy ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.09.2007, 19:53 Nach oben    #5
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.378
Standard

Das sieht interessant aus! Werde ich auf jeden Fall mal näher anschauen!!
Danke!
Jann Hendrik ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.09.2007, 20:26 Nach oben    #6
Dejan Spasic
 
Benutzerbild von dejan_spasic
 
Registriert seit: 05.01.2006
Ort: Düsseldorf
Beiträge: 169
Standard

Fileinfo wäre die bessere Alternative. Der Nachteil ist nur, dass es über PECL
nachträglich installiert werden muss.
__________________
Da wir alle in einem Boot sitzen, ist es gut, dass wir nicht alle auf einer Seite stehen... (mir unbekannt)
dejan_spasic ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.09.2007, 20:27 Nach oben    #7
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 597
Standard

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.
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.09.2007, 20:31 Nach oben    #8
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

is_file() liest doch nicht die Datei aus und zum Rückgabewert lese ich u.A. folgendes in der Doku:

Zitat:
Returns an array with 5 elements.

Index 0 and 1 contains respectively the width and the height of the image.

Note: Some formats may contain no image or may contain multiple images. In these cases, getimagesize() might not be able to properly determine the image size. getimagesize() will return zero for width and height in these cases.

[…]

On failure, FALSE is returned.
http://php.net/getimagesize

if (count($…-) > 0) ist demnach nicht ausreichend.

Basti

Geändert von Basti (08.09.2007 um 20:37 Uhr)
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.09.2007, 21:05 Nach oben    #9
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 597
Standard

Naja is_file muss ja die Datei oder Dateihaeder auslesen, wie soll sonst diese Funktion prüfen könnnen
Und bei getimagesize reicht schon die Array-Ausgabe mit dem Bildtyp.
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.09.2007, 21:16 Nach oben    #10
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.378
Standard

Zitat:
Zitat von Basti Beitrag anzeigen
if (count($…-) > 0) ist demnach nicht ausreichend.
also so?

PHP-Code:
function checkIfImage($stringFile)
    {
      
$booleanReturnValue FALSE;

      if (
is_file ($stringFile) === TRUE AND is_readable($stringFile) === TRUE)
      {
        list(
$src_width$src_height$src_typ) = getimagesize ($stringFile$arrayResult);

        if (
count($arrayResult) > 0
            
AND
            
$src_width 0
            
AND
            
$src_height 0
            
AND
            
$src_typ 0)
        {
          
$booleanReturnValue TRUE;
        }

        unset(
$stringFile$arrayResult);
      }
      return 
$booleanReturnValue;
    } 

mal von der Diskussion um is_file() abgesehen...
Jann Hendrik ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.09.2007, 21:41 Nach oben    #11
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

PHP-Code:
if ($arrayResult && $arrayResult[0] > 0
…sollte ja reichen. Allerdings sollte ein @ vor getimagesize() und die Zuweisung auf die einzelnen Variablen (list($src_width, …-)) darf dann natürlich erst nach dieser Prüfung erfolgen.

Zitat:
Zitat von CIX88 Beitrag anzeigen
Naja is_file muss ja die Datei oder Dateihaeder auslesen, wie soll sonst diese Funktion prüfen könnnen
Und bei getimagesize reicht schon die Array-Ausgabe mit dem Bildtyp.
Ich bin auf dem Gebiet nicht wirklich fit, aber werden diese Infos nicht im Dateisystem gespeichert und von PHP nicht doppelt ausgelesen, wenn clearstatcache() nicht benutzt wird. Für die Bild-Typ-Info wird jedoch, soweit ich weiß in die ersten Bytes der Datei geschaut, oder?

Basti

Geändert von Basti (08.09.2007 um 21:48 Uhr)
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.09.2007, 21:46 Nach oben    #12
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.378
Standard

habe auch gerade gemerkt, dass mein obiger post sinnlos ist...
Jann Hendrik ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.09.2007, 00:19 Nach oben    #13
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 597
Standard

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
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.09.2007, 09:53 Nach oben    #14
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 688
Standard

@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
MrNiceGuy ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.09.2007, 14:11 Nach oben    #15
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 597
Standard

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.
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.09.2007, 17:14 Nach oben    #16
Lutz
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 688
Standard

@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
MrNiceGuy ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.09.2007, 18:06 Nach oben    #17
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 597
Standard

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:
dass ich ein Verzeichnis durchwühle und alle Eintrage
Sind denn dort auch Ordner mit drin ?
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.09.2007, 18:09 Nach oben    #18
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.378
Standard

Zitat:
Zitat von CIX88 Beitrag anzeigen
Zitat:
dass ich ein Verzeichnis durchwühle und alle Eintrage
Sind denn dort auch Ordner mit drin ?
Davon werde ich ausgehen, bzw. ich will das nicht gleich von Anfang an so beschränken, dass dies eine Bedingung sein muss.

Verzeichnisse, Word-Dateien, Jpeg und symlinks...
whatever. Es interessieren davon aber nur die JPEG, PNG und GIF.
Jann Hendrik ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.09.2007, 18:23 Nach oben    #19
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 597
Standard

Achsoooooo, jo dann würde ich das auch mit glob() etc.. schon im Vorfeld ausfiltern das am Ende nur noch die Dateien mit Bildern übrig bleiben.
Ich weis ja nicht welchen Umfang das ganze hat.

Muss ein wilder Odner sein
CIX88 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.09.2007, 18:40 Nach oben    #20
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.378
Standard

Naja - wahrscheinlich werden es nur Bilder sein...
Aber allein die Tatsache, dass wenn man per ftp Bilder hochlädt und dann die Thumbs.db dabei ist, die Windows gerne anlegt.

Darüber hinaus kommt die Idee das ganze Rekursiv aufbauen zu können....

Die Fälle sollen dann auch mit abgedeckt sein.
Jann Hendrik ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Bild anzeigen je nach datei Garnele PHP-Programmierung 13 01.01.2006 13:39
Bild Komponent - Bild zurecht schneiden Robinson Desktop-Applikationen und Grafik 5 31.12.2005 13:53
prüfen ob ordner oder datei Igi PHP-Programmierung 14 26.08.2005 23:27
Textausgabe in Datei obiwankenobi Allgemeine Java-Programmierung 2 09.05.2005 12:51
Java findet Datei nicht Niki_Tesla Allgemeine Java-Programmierung 14 14.12.2004 22:31


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:16 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45