2009-09-01 10 views
14

finden, wenn ich versuche, getimagesize($img) und das Bild nicht existiert, erhalte ich einen Fehler. Ich möchte nicht zuerst prüfen, ob die Datei existiert, sondern nur den Fehler behandeln.Handle Fehler, wenn getimagesize kann keine Datei

Ich bin nicht sicher, wie try catch funktioniert, aber ich möchte, wie etwas tun:

try: getimagesize($img) $works = true 
catch: $works = flase 

Antwort

40

Wie Sie schon sagten, wenn auf einer nicht vorhandenen Datei verwendet, erzeugt getimagesize eine Warnung:

Dieser Code:

if ($data = getimagesize('not-existing.png')) { 
    echo "OK"; 
} else { 
    echo "NOT OK"; 
} 

erhalten Sie eine

Warning: getimagesize(not-existing.png) [function.getimagesize]: 
    failed to open stream: No such file or directory 


Eine Lösung wäre es, die @ operator zu verwenden, diesen Fehler zu maskieren:

if ($data = @getimagesize('not-existing.png')) { 
    echo "OK"; 
} else { 
    echo "NOT OK"; 
} 

Da die Datei nicht existiert, wird $ Daten noch falsch sein; aber keine Warnung wird angezeigt.


Eine andere Lösung wäre check if the file exists, bevor getimagesize verwendet wird; so etwas wie dies tun würde:

if (file_exists('not-existing.png') && 
    ($data = getimagesize('not-existing.png')) 
    ) { 
    echo "OK"; 
} else { 
    echo "NOT OK"; 
} 

Wenn die Datei nicht existiert, wird getimagesize nicht genannt - was bedeutet, dass keine Warnung

Dennoch ist diese Lösung nicht die, die Sie für Bilder verwenden sollten, die auf einem anderen Server und Zugriff über HTTP (wenn Sie in diesem Fall sind), da dies zwei Anfragen an den Remote-Server bedeutet.

Für lokale Bilder, das wäre ganz OK, nehme ich an; Das einzige Problem, das ich sehe, ist die Meldung, wenn ein Lesefehler nicht maskiert wird.


Endlich:

  • ich Fehler erlauben würde, auf Ihrem developpement Server angezeigt werden,
  • Und wäre nicht die auf dem Produktionsserver angezeigt werden - siehe display_errors, darüber ;-)
+4

Wohlgemerkt, wenn file_exists() erzählt die Datei vorhanden ist, getimagesize() kann immer noch nicht, wie die Datei in zwischen Methodenaufrufen nur gelöscht werden. Veeery unwahrscheinlich, aber passiert in den schlimmsten Momenten ... – ya23

+1

@ ya23: true; aber du müsstest sehr unglücklich sein ^^ Und ich mag es nicht, Fehler mit @ zu maskieren: Wenn du es verwendest und ein Problem hast, ist es im Allgemeinen schnell ein Problem zu debuggen :-( –

+1

Nun, ich denke, das @ ist ziemlich dreckig :) – Gigala

7

Nennen Sie mich einen dreckigen Hacker Zombie, der zur Hölle gehen wird, aber ich komme normalerweise um dieses Problem herum, indem ich die Warnungsausgabe in einen Ausgabepuffer fange und dann den Puffer überprüfe. Versuchen Sie folgendes:

ob_start(); 
$data = getimagesize('not-existing.png'); 
$resize_warning = ob_get_clean(); 
if(!empty($resize_warning)) { 
    print "NOT OK"; 
    # We could even print out the warning here, just as PHP would do 
    print "$resize_warning"; 
} else { 
    print "OK" 
} 

Wie ich schon sagte, nicht die Art und Weise einen gemütlichen Platz in Programmierers den Himmel zu kommen, aber wenn es um dysfunktionale Fehlerbehandlung kommt, hat ein Mann zu tun, was ein Mann zu tun hat.

+7

Du bist ein dreckiger Hacker-Zombie, der zur Hölle fahren wird. – Seb

5

Es tut mir leid, dass so altes Thema zu erheben. Kürzlich stieß ein ähnliches Problem und fand dieses Thema stattdessen eine Lösung. Aus religiösen Gründen denke ich, dass "@" eine schlechte Entscheidung ist.Und dann finde ich eine andere Lösung, es so etwas wie folgt aussieht:

function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new Exception($errstr); 
} 
set_error_handler("exception_error_handler"); 

try { 
    $imageinfo = getimagesize($image_url); 
} catch (Exception $e) { 
    $imageinfo = false; 
}