Bilder zuschneiden, Fehler bei manchen Dateien

Shinzo

Mitglied
Hallo,

ich habe mir ein Upload-Script gebastelt, das mir erstmal das Bild hochlädt, ein Thumbnail davon erstellt, dann ein kleineres Thumbnail aus dem erstes Thumbnail zuschneidet und zum Schluss das zuerst erstellte Thumbnail löscht. Funktioniert einwandfrei. Jedoch kommt ab und zu folgender Fehler vor:

Ich habe eine GIF-Datei, hab den MIME-Typ bereits mit einem anderen Script geprüft und dieser ist image/gif. Wenn ich diese Datei dann mit dem hiergeposteten Script hochlade, dann erscheint plötzlich ein Fehler. Bei anderen GIF-Dateien lädt er ohne Probleme hoch.

Ich poste einmal das Bild-Script, sowie die Fehlermeldung, vielleicht hatte ja bereits das gliche Problem und kann mir weiterhelfen.

PHP:
	$type = $_FILES['file']['type'];
	if (($type == "image/jpeg") || ($type == "image/jpg") || ($type == "image/pjpeg"))
	{
	$ext = ".jpg";
	}
	if (($type == "image/gif"))
	{
	$ext = ".gif";
	}
	if(mysql_affected_rows() !=0) 
 	{
  	$destination = mysql_insert_id(); + 1;
	}

$pfad = "img";
$news_image = "img_"."$destination$ext";
move_uploaded_file($_FILES['file']['tmp_name'],"$pfad/$news_image");

if($ext == ".gif") { $src = imagecreatefromgif('img/'.$news_image); }
if($ext == ".jpg") { $src = imagecreatefromjpeg('img/'.$news_image); }

$width = imagesx($src);
$height = imagesy($src);
$x = "100";
$div=$width/$x;
$hoehe=$height/$div;
$y = $hoehe;
$dst = imagecreatetruecolor($x, $y);
imagecopyresampled($dst, $src, 0, 0, 0, 0, $x, $y, $width, $height);

if($ext == ".gif") { imagegif($dst,"$pfad/"."thumb_"."$news_image"); }
if($ext == ".jpg") { imagejpeg($dst,"$pfad/"."thumb_"."$news_image",1000); }

$Ausschnitt_Breite = 80;
$Ausschnitt_Hoehe = 80;
$Position_x = 5;
$Position_y = 5;

if($ext == ".gif") { $img1 = imagecreatefromgif('img/thumb_'.$news_image); }
if($ext == ".jpg") { $img1 = imagecreatefromjpeg('img/thumb_'.$news_image); }			

$img2 = imagecreatetruecolor($Ausschnitt_Breite+2, $Ausschnitt_Hoehe+2);
imagecopymerge($img2, $img1, 1, 1, $Position_x, $Position_y, $Ausschnitt_Breite, $Ausschnitt_Hoehe, 100);
if($ext == ".gif") { imagegif($img2,"$pfad/"."small_"."$news_image"); }
if($ext == ".jpg") { imagejpeg($img2,"$pfad/"."small_"."$news_image" ,1000); }

// löschen
imagedestroy($img1);
imagedestroy($img2);
unlink($pfad."/thumb_".$news_image);

Warning: imagecreatefromgif(): 'img/img_45.gif' is not a valid GIF file in /geändert/uploadnow.php on line 53
Warning: imagesx(): supplied argument is not a valid Image resource in /geändert/uploadnow.php on line 56
Warning: imagesy(): supplied argument is not a valid Image resource in /geändert/uploadnow.php on line 57
Warning: Division by zero in /geändert/uploadnow.php on line 60
Warning: imagecreatetruecolor(): Invalid image dimensions in /geändert/uploadnow.php on line 62
Warning: imagecopyresampled(): supplied argument is not a valid Image resource in /geändert/uploadnow.php on line 63
Warning: imagegif(): supplied argument is not a valid Image resource in /geändert/uploadnow.php on line 65
Warning: imagecreatefromgif(img/thumb_img_45.gif): failed to open stream: No such file or directory in /geändert/uploadnow.php on line 73
Warning: imagecopymerge(): supplied argument is not a valid Image resource in /geändert/uploadnow.php on line 77
Warning: imagedestroy(): supplied argument is not a valid Image resource in /geändert/uploadnow.php on line 82
Warning: unlink(img/thumb_img_45.gif): No such file or directory in /geändert/uploadnow.php on line 84
Warning: Cannot modify header information - headers already sent by (output started at /geändert/uploadnow.php:53) in /geändert/uploadnow.php on line 89
 
Du solltest dich nicht allein auf die vom Client gesendeten Informationen verlassen – niemals.
Mit der getimagesize()-Funktionen lassen sich Informationen zu einer Grafikdatei ermitteln, unter anderem auch der MIME-Typ. Wird ein „false“ zurückgeliefert, handelt es sich um ein nicht von PHP unterstütztes Grafikformat oder gar keine Grafik.
 
Das sind ganz normale Dateien, die in ihrer Größe unauffälig sind.

@ Gumbo

Welchen Unterschied macht es denn? Ich vesteh nicht wieso es Unterschiede beim Senden oder bei getimagesize geben könnte. Könntest du das kurz erläutern.
 
Die Fehlermeldung besagt doch, dass es sich bei der Datei „img_45.gif“ um keine gültige GIF-Grafik handelt. Also solltest du vor der Verarbeitung der Datei prüfen, ob es sich um eine gültige Grafikdatei handelt. Und das ist mit der getimagesize()-Funktion möglich.
Denn die Angabe des Media-Typs kommt vom Browser/Betriebssystem. Doch diese halten sich meines Wissens dabei auch nur an den Dateierweiterungen fest. So lässt sich auch eine einfache Textdatei durch den Dateinamen „foobar.gif“ als vermeintliche GIF-Grafik klassifizieren. Daher ist es immer ratsam, den tatsächlichen Typ erst auf dem Server zu ermitteln.
 
Zurück