Upload Bilder automatisch verkleinern - wie?

buzzom

Mitglied
Hallo,

Das Ziel soll sein, dass man ein Bild hochladen kann und es in der Datenbank abgespeichert wird. Soweit habe ich das auch schon folgendermaßen hinbekommen:

PHP:
if($_FILES['profilbild']['size']>100000) {$fehler.="<br>Die Datei ist zu gross!";}

    if(!($_FILES['profilbild']['type'] == 'image/jpeg' OR $_FILES['profilbild']['type'] == 'image/gif'))
      {$fehler.="<br>Der Dateityp ist nicht zulaessig!<br>";}

    if(!$fehler)
     {
       $datei=fopen($_FILES['profilbild']['tmp_name'],'rb');
       $data=addslashes(fread( $datei, $_FILES['profilbild']['size']));
       
	   $db = new db();
	   $sql="INSERT INTO profile_pictures (ID, dateityp, datei) VALUES ('".$db->prepare($ID)."','".$db->prepare($_FILES['profilbild']['type'])."','".$db->prepare($data)."')";
       $result=$db->execute($sql);
     }
       if($fehler){ echo "<font color=\"red\">".$fehler."</font>";}

Wie man sieht wird auch geprüft, dass das Bild nicht mehr als 100kb groß sein darf.

Ich möchte jetzt aber da noch einbauen, dass wenn das bild zwar nicht größer als 100kb ist aber von den Abmaßen zu gross ist, es automatisch kleiner gemacht wird, bevor es in der DB landet. z.B. nicht höher als 300 pixel , die Breite passt sich dann dazu autoamatisch passend an.

Hat da jemand ne Idee?
Ich würde mich sooo freuen... :)

Gruß
 
Ist ziemlich zusammengeschmiert, aber so was in der Richtung?

PHP:
function img_make_thumbnail($path, $newpath, $maxwidth=NULL)
	{
		$size       = getimagesize($path);
		$breite     = $size[0];
		$hoehe      = $size[1];
		$neueBreite = $maxwidth;
		$neueHoehe  = intval($hoehe*$neueBreite/$breite);

		if($maxwidth!==NULL && $breite>$maxwidth)
		{
			if($size[2]==1)
			{
				// GIF
				$altesBild=ImageCreateFromGIF($path);
				$neuesBild=ImageCreateTrueColor($neueBreite,$neueHoehe);
				ImageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);
				return ImageGIF($neuesBild,$newpath);
			}
			elseif($size[2]==2)
			{
				// JPG
				$altesBild=ImageCreateFromJPEG($path);
				$neuesBild=ImageCreateTrueColor($neueBreite,$neueHoehe);
				ImageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);
				return ImageJPEG($neuesBild,$newpath,100);
			}
			elseif($size[2]==3)
			{
				// PNG
				$altesBild=ImageCreateFromPNG($path);
				$neuesBild=ImageCreateTrueColor($neueBreite,$neueHoehe);
				ImageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);
				return ImagePNG($neuesBild,$newpath);
			}
		}
		else
		{
			return copy($path, $newpath);
		}
		return false;
	}
 
Also ich hab jetzt mal bissl rumgefrikkelt aber bekomme es nicht hin:
Wo ist hier nur der Wurm drin?

PHP:
$size = getimagesize($_FILES['profilbild']['tmp_name']);
		$breite     = $size[0];
        $hoehe      = $size[1];
        $neueBreite = "200";
		$neueHoehe  = $neueBreite *2;
		
		echo "Neue Breite: ".$neueBreite." : Neue Hoehe: ".$neueHoehe."<p>";
		echo "Typ: ".$size[2]."<p>";
		  
		   if($size[2]==2)
            {
                // JPG
                $altesBild=ImageCreateFromJPEG($_FILES['profilbild']['tmp_name']);
                $neuesBild=ImageCreateTrueColor($neueBreite,$neueHoehe);
                ImageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);
                $datei = ImageJPEG($neuesBild);
				$data=addslashes(fread( $datei, $_FILES['profilbild']['size']));
            }
		
	  
	    $db = new db();
	    $dateityp = $_FILES['profilbild']['type'];
	    $sql="UPDATE profile_pictures SET dateityp='$db->prepare$dateityp', datei='$db->prepare$data' WHERE ID='$ID'";
		 $result=$db->execute($sql);

ich schätze mal hier irgendwo:

PHP:
 $datei = ImageJPEG($neuesBild);
				$data=addslashes(fread( $datei, $_FILES['profilbild']['size']));

danke
 
Irgendwie macht mich der Teil wuschig:
$db->prepare$dateityp
Aber ich bin ja auch noch gar nich wieder richtig wach. -.-

Ja, hau mal bitte die Ausgabe von print_r($_FILES) rüber.
 
PHP:
$db->prepare$dateityp
Ja ich denke auch, dass du da Klammern vergessen hast, denn sonst ist diese Zeile meiner Meinung nach sinnfrei. Also dann eher so:
PHP:
$db->prepare($dateityp);
Zudem vermute ich mal stark, dass das bei dir nicht so aussieht, denn sonst solltest du eigentlich irgendwelche Fehlermeldungen erhalten.
PHP:
<pre>
<?php
error_reporting(E_ALL);
// Code der dich verrückt macht ;-D
?>
</pre>
MfG, Andy
 
So Klammern gesetzt, aber das hat an anderer Stelle bei UPDATE auch ohne Klammern funktioniert, komischerweise.
Also mit der bisher beschriebenen Methode haut er so ein Frickelzeugs raus wie:

Code:
lN§ØÁ¨-“UÄ”3ãë^M`sËÅTš\t¢Gâ¨ÌôÅq%›žµ_Ï)*°à©õ¦³?MZ†È°…R˜ø„êÏFH8® 4P ï]¿Ž’ù‘¸+†ÇÔ/õÍq~Y Ø«Cn6æ^¢ã9Êý8‰#á?RGt#ük.ÒAÒH9eaǨî?,Õ™§Räô’¾¾¼ÐŠ{žsãá&ºRc¸õ®<ÅU]Ääœtæ©ÊÖŸë$ZdãçS×"–ØâäŸj}È?c¸5_dŸ´DŠ–CˆÍ@§‘R¿*=Í$ÆÉ"^#SS'+š‰ŸLV~\ö5¤LäB•÷4¡Êܱµ(\ȃޢûC}iµ`;ù.-§øG$h„Ëk!C8o8?ýõ±ÎßöDÝ…y¤`³ž€“Ï¥z"Ô¡ñ nga©ÜŒ’n_A‚óÿ?LñüF¼ôãtìù52Ý2¡Ô»hcLK9ûç ?Vqûô‹û  (Rè7?ÿÙ
Warning: fread(): supplied argument is not a valid stream resource in /www/htdocs/system/profile/mein_profil_bearbeiten.php on line 417

Line 417 steht ja wie schon weiter oben angemerkt:
PHP:
$data=addslashes(fread( $datei, $_FILES['profilbild']['size']));

Code:
print_r($_FILES) ergibt: Array ( [profilbild] => Array ( [name] => bild.jpg [type] => image/jpeg [tmp_name] => /tmp/phpnhfoJf [error] => 0 [size] => 20056 ) )


danke.
 
Zuletzt bearbeitet:
ja poste mal dein gesamtes script!
Exakt die Line anzugeben die er als Fehler auswirft hat selten den Fehler gebracht. Der liegt vermutlich etwas weiter oben.
Aber um sich einen gesamtüberblick zu verschaffen musst du schon mehr von deinem script offenbaren!
 
Ich könnte mich auch komplett irren, aber ist $_FILES['profilbild']['size'] nicht ein String?
Somit müsstest du intval( $_FILES['profilbild']['size'] ) in fread() schreiben, da fread() einen int-Parameter verlangt.
string fread ( resource $handle , int $length )

Wie gesagt, kann auch sein das ich mich irre. Ich arbeite nicht viel mit Upload :)
 
Haha wie geil jetzt seh ich das erst woran der Fehler liegt.
Loomes du hast mich stutzig gemacht.
Hab mir die Zwei Zeilen hier angesehen:
PHP:
 $datei = ImageJPEG($neuesBild); 
                $data=addslashes(fread( $datei, $_FILES['profilbild']['size']));
da viel es mir wie schuppen von den augen:
Was macht den fread?
fread() liest length Bytes vom Dateizeiger handle .
und $datei ist kein Dateizeiger sondern die Binärdaten des Bildes ;)
Versuchs mal so :D
PHP:
$data = $datei;
 
Zurück