GetImageSize - Problem mit externen Bildern

  • Themenstarter Themenstarter ByeBye 242513
  • Beginndatum Beginndatum
Debugging-Ausgaben:
Code:
string(40) "http://www.mein_domain.de/img/test/1.jpg"
bool(false)
NULL
NULL

Ich werde das Gefühl nicht los, dass irgendetwas an der PHP Config Datei nicht passt. Gibt es noch einen Wert den ich überprüfen sollte? Das Interessante ist nämlich, dass ich diesen Script schon des öfteren eingesetzt habe und immer funktioniert hat. Nur auf dem aktuellen Server irgendwie nicht...
 
Zuletzt bearbeitet von einem Moderator:
Ja, es wird ein Bild angezeigt.

Wenn ich die URL ohne http://... eingebe funktioniert das skalieren wunderbar, nur wenn http://... dabei steht wird es in Originalgröße angezeigt. Und das obwohl das Bild bei beiden Varianten, zu Testzwecken, auf meinem Server liegt.
 
Hallo!

Code:
allow_url_fopen = on
Wo hast Du diese Zeile her?
Sieht mir ganz nach php.ini aus.
Dann würde ich mal kontrollieren dass Du auch die richtige php.ini erwischt hast.
phpinfo() sagt Dir welche php.ini die richtige ist..... und nennt Dir auch gleich dessen Einstellungen.

PHP:
// Schreib mich an den Anfang des Scripts
error_reporting(E_ALL);
ini_set('display_errors', 1);
Es erscheint keine Meldung. Funktioniert aber immer noch nicht...
Kannst Du denn sicherstellen dass ini_set() und error_reporting() z.b. nicht unter "disable_funktions =" in der php.ini eingetragen sind?

Ja, sowas gibt var_dump() für getimagesize() aus wenn allow_fopen_url deaktiviert ist oder die Datei nicht gefunden wurde.
Da Du aber sagst dass die Datei existiert und sich auch aufrufen lässt, bleibt ja nurnoch übrig dass allow_fopen_url deaktiviert ist.

Versuche mal einen Gegentest (inkl. der genannten URL):
PHP:
$imageurl = "http://static.php.net/www.php.net/images/php.gif";
//$image_array = getimagesize($imageurl);
$image_array = fopen($imageurl, "r");
var_dump($image_array);
Wenn Du wieder ein bool(false) bekommst, ist die Sache klar.
Wenn Du ein "resource(2) of type (stream)" bekommst, dann nimm den Code nochmal für getimagesize().
Dann solltest Du dieses zurückbekommen:
Code:
array(7) { [0]=> int(120) [1]=> int(67) [2]=> int(1) [3]=> string(23) "width="120" height="67"" ["bits"]=> int(7) ["channels"]=> int(3) ["mime"]=> string(9) "image/gif" }

Gruss Dr Dau
 
Interessanterweise hat er error_reporting() eingeschaltet, sowie display_errors auf 1 und es kommt keine E_NOTICE, das auf ein nicht-existentes Array-Index ($imagearray[0] und $imagearray[1]) zugreift. Alles sehr seltsam das...
 
Interessanterweise hat er error_reporting() eingeschaltet, sowie display_errors auf 1 [..]
Nützt nur nichts wenn diese Funktionen (und ini_set()) in der php.ini unter den deaktivierten Funktionen eingetragen ist.
Und wenn in der php.ini dann auch noch das error_reporting() deaktiviert ist, dann gute Nacht. ;)
Über den "Sinn" einer solchen Konfiguration brauchen wir sicherlich nicht diskutieren, aber sie ist halt nicht auszuschliessen.

Fakt ist dass der von mir gezeigte Code mit der URL zur Grafik von php.net funktioniert (getestet), sofern allow_fopen_url auf "on" steht.
Es ist ja auch nicht auszuschliessen dass das Hotlinking beim TE unterbunden wird, da kann ein Test mit einer fremden Grafik auf einem fremden Server (wie die von mir verwendete Grafik) nicht schaden.
Ich sehe derzeit jedenfalls keinen Sinn darin das Problem irgendwo im Code vom TE zu suchen..... das Problem liegt irgendwo anders.
 
Hallo!

Wo hast Du diese Zeile her?
Sieht mir ganz nach php.ini aus.
Dann würde ich mal kontrollieren dass Du auch die richtige php.ini erwischt hast.
phpinfo() sagt Dir welche php.ini die richtige ist..... und nennt Dir auch gleich dessen Einstellungen.

Kannst Du denn sicherstellen dass ini_set() und error_reporting() z.b. nicht unter "disable_funktions =" in der php.ini eingetragen sind?

Ja, sowas gibt var_dump() für getimagesize() aus wenn allow_fopen_url deaktiviert ist oder die Datei nicht gefunden wurde.
Da Du aber sagst dass die Datei existiert und sich auch aufrufen lässt, bleibt ja nurnoch übrig dass allow_fopen_url deaktiviert ist.

Versuche mal einen Gegentest (inkl. der genannten URL):
PHP:
$imageurl = "http://static.php.net/www.php.net/images/php.gif";
//$image_array = getimagesize($imageurl);
$image_array = fopen($imageurl, "r");
var_dump($image_array);
Wenn Du wieder ein bool(false) bekommst, ist die Sache klar.
Wenn Du ein "resource(2) of type (stream)" bekommst, dann nimm den Code nochmal für getimagesize().
Dann solltest Du dieses zurückbekommen:
Code:
array(7) { [0]=> int(120) [1]=> int(67) [2]=> int(1) [3]=> string(23) "width="120" height="67"" ["bits"]=> int(7) ["channels"]=> int(3) ["mime"]=> string(9) "image/gif" }

Gruss Dr Dau


Vielen Dank Dr Dau. Zu meinem erstaunen kam als Meldung tatsächlich
Code:
resource(2) of type (stream)
und auch
Code:
array(7) { [0]=> int(120) [1]=> int(67) [2]=> int(1) [3]=> string(23) "width="120" height="67"" ["bits"]=> int(7) ["channels"]=> int(3) ["mime"]=> string(9) "image/gif" }

Danach habe ich mit meinen Script ein Bild verwenden, dass nicht auf meinem Server liegt. Und siehe da, es funktioniert! Anscheinend darf ich bei Bildern die auf meinem Server liegen nicht den kompletten Pfad verwenden http://.. Ist zwar komisch, aber wenigstens weiß ich jetzt was zu tun ist.

Vielen Dank an alle!
 
Damit steht schonmal fest dass es nicht an allow_fopen_url liegt. ;)

Ich habe nochmal etwas getestet.
Sind in den Verzeichnis- und/oder Dateinamen zufälligerweise Leerzeichen enthalten?
Wenn ja:
PHP:
$imageurl = "my file.jpg";
$image_array = getimagesize($imageurl);
var_dump($image_array);
funktioniert.

Ein:
PHP:
$imageurl = "http://www.my-domain.de/my file.jpg";
$image_array = getimagesize($imageurl);
var_dump($image_array);
liefert hingegen ein bool(false) zurück.

Abhilfe wird geschafft wenn man die Leerzeichen konvertiert:
PHP:
$imageurl = str_replace(" ", "%20", "http://www.my-domain.de/my file.jpg");
$image_array = getimagesize($imageurl);
var_dump($image_array);

Aber, ein:
PHP:
$imageurl = str_replace(" ", "%20", "my file.jpg");
$image_array = getimagesize($imageurl);
var_dump($image_array);
liefert wiederum ein bool(false) zurück.

Zusammenfassung:
Man muss zwischen lokalen und entfernten Dateien unterscheiden.
Bei lokalen Dateien dürfen die Leerzeichen nicht konvertiert werden.
Bei entfernten Dateien müssen die Leerzeichen konvertiert werden.

Damit wir flexibel sind, prüfen wir mittels regulärer Ausdrücke ob der String aus §imageurl mit http:// oder ftp:// beginnt:
PHP:
$imageurl = "http://www.my-domain.de/my file.jpg";

if(preg_match('/^(http|ftp):\/\//', $imageurl)) { // wenn $imageurl mit http:// oder ftp:// beginnt.....
    $image = str_replace(" ", "%20", $imageurl); // dann konvertiere die Leerzeichen und setze eine neue Variable
} else { // sonst.....
    $image = $imageurl; // setze eine neue Variable mit dem unveränderten String aus $imageurl
}

var_dump($image);

Alternativ würde es auch kürzer funktionieren:
PHP:
$imageurl = "http://www.my-domain.de/my file.jpg";

if(preg_match('/^(http|ftp):\/\//', $imageurl)) { // wenn $imageurl mit http:// oder ftp:// beginnt.....
    $imageurl = str_replace(" ", "%20", $imageurl); // dann konvertiere die Leerzeichen und überschreibe die alte Variable
}

var_dump($imageurl);
 
Zurück