Bilder hochladen, kopieren und verkleinern

crashx

Erfahrenes Mitglied
Wieder mal ich, mit meinem Mageren PHP Wissen.

Ok ich möchte Bilder hochladen, kopieren, die erste Kopie im Originalzustand sprich grösse belassen und in einen Ordner speichern den Pfad in eine DB schreiben

Die 2 Kopie möchte ich verkleinern und in einen anderen Ordner speichern, den Pfad in eine DB schreiben.
Das ganze zwecks thumbnail vorschau.

Die Theorie ist für mich auch noch Verständlich aber nun geht es an die umsetzung.
Folgendes habe ich zusammen mit Euch schon erarbeitet:

Bild hochladen, verkleinern, speichern, Pfad in MySql DB Schreiben.
Nun habe ich mich mit der Funktion imagecopy beschäftigt und herausgefunden das mich das leicht überfordert.
Deshalb hoffe ich von Euch wieder mal tatkräftig unterstüzt zu werden.

Hier was ich schon habe:

PHP:
<? 
include("dbconnect.php"); 

if (isset($_FILES)) 
  { 
    for($i = 0; $i < count($_FILES['file']['tmp_name']); ++$i) //erzwingt das jede datei eine eindeutige zuweisung erhält [0], [1], [2], usw 
      { 
        $tempname = $_FILES['file']['tmp_name'][$i]; //temporärer name 
        $name     = $_FILES['file']['name'][$i]; //entgültiger name 
         
        if (is_uploaded_file($tempname)) //lädt die temporäre datei hoch 
          { 
            $im_temp = imagecreatefromjpeg($tempname); //Ich gehe jetzt einfach mal davon aus das es JPEGs sind 
            $size = getimagesize("$tempname");
  			$height_orig = $size[1];
  			$width_orig = $size[0];
  			$height = 150;
  			$width = 200; 

            //Wobei mir hier nicht klar ist was in $width steht... 
            if ($width && ($width_orig < $height_orig)) 
            { 
               $width = ($height / $height_orig) * $width_orig; 
             } 
             else 
            { 
               $height = ($width / $width_orig) * $height_orig; 
             } 

             //Thumbnail-Rohling erstellen 
             $newImg =  imagecreatetruecolor($width, $height); 

             //Das original Bild auf den Thumbnail kopieren 
             imagecopyresampled($newImg, $im_temp, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); 
      
             //Den Thumbnail als $tempname in höchster Qualität speichern 
             imagejpeg($newImg, "$tempname", 100); 

             move_uploaded_file($tempname,"upload/images/$name"); //verschiebt die dateien in das verzeichnis, gibt der datei ihren entgültigen name. 
          } 
      } 			
                    $eintrag = " 
                    
                    INSERT INTO 
                    `bilder` 
                      SET 
                    `pic1`   = '".mysql_real_escape_string('upload/images/'.$_FILES['file']['name'][0])."', 
                    `pic2`   = '".mysql_real_escape_string('upload/images/'.$_FILES['file']['name'][1])."', 
                    `pic3`   = '".mysql_real_escape_string('upload/images/'.$_FILES['file']['name'][2])."'"; 
            $eintragen = mysql_query($eintrag);   
    } 
echo mysql_error(); 
?>
 
@Funky_MF Wie beschrieben möchte ich Das original und ein Thumbnail erstellen/Speichern
 
Zuletzt bearbeitet:
Also, wenn ich das richtig verstehe, dann liegt dein Problem in diesen beiden Zeilen:
PHP:
imagejpeg($newImg, "$tempname", 100);  

move_uploaded_file($tempname,"upload/images/$name"); //verschiebt die dateien in das verzeichnis, gibt der datei ihren entgültigen name.

Ich würde stattdessen folgendes schreiben (nicht getestet):
PHP:
imagejpeg( $tempname, "upload/images/thumbs/".$newImg 100);  //Erstellt eine Thumbnail-Datei im Verzeichnis /thumbs

move_uploaded_file($newImg,"upload/images/".$name); //verschiebt die Original-Datei in das Verzeichnis /images
 
Zuletzt bearbeitet:
Ok ich habe mich nochmal damit befasst.

Die lösung habe ich aber....

PHP:
if (isset($_FILES)) 
  { 
    for($i = 0; $i < count($_FILES['file']['tmp_name']); ++$i) //erzwingt das jede datei eine eindeutige zuweisung erhält [0], [1], [2], usw 
      { 
        $tempname = $_FILES['file']['tmp_name'][$i]; //temporärer name 
        $name     = $_FILES['file']['name'][$i]; //entgültiger name
Hier füge ich noch Folgendes ein.
PHP:
move_uploaded_file($tempname,"images/$name");
Das geht ganz gut, Das bild wird mir im Ordner "images/" gespeichert

Nun aber das problem. das script wird hier Angehalten, wie kann ich das machen das es mir den Rest des scripts weiter ausführt?
so dass das bild verkleinert und danach wieder gespeichert wird?
PHP:
        if (is_uploaded_file($tempname)) //lädt die temporäre datei hoch 
          { 
            
            $im_temp = imagecreatefromjpeg($tempname); //Ich gehe jetzt einfach mal davon aus das es JPEGs sind 
            $size = getimagesize("$tempname");
  			$height_orig = $size[1];
  			$width_orig = $size[0];
  			$height = 150;
  			$width = 200; 

            //Wobei mir hier nicht klar ist was in $width steht... 
            if ($width && ($width_orig < $height_orig)) 
            { 
               $width = ($height / $height_orig) * $width_orig; 
             } 
             else 
            { 
               $height = ($width / $width_orig) * $height_orig; 
             } 

             //Thumbnail-Rohling erstellen 
             $newImg =  imagecreatetruecolor($width, $height); 

             //Das original Bild auf den Thumbnail kopieren 
             imagecopyresampled($newImg, $im_temp, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); 
      
             //Den Thumbnail als $tempname in höchster Qualität speichern 
             imagejpeg($newImg, "$tempname", 100); 

             move_uploaded_file($tempname,"thumbs/thumb_$name"); //verschiebt die dateien in das verzeichnis, gibt der datei ihren entgültigen name. 
            echo "Die Datei $name wurde erfolgreich hochgeladen!<br />"; 
          } 
      } 			
  }        

    				$eintrag = " 
                    
                    INSERT INTO 
                    `bilder` 
                      SET 
                    `pic`   = '".mysql_real_escape_string('upload/images/'.$_FILES['file']['name'][0])."',
                    `thumb`   = '".mysql_real_escape_string('upload/thumbs/thumb_'.$_FILES['file']['name'][0])."'"; 
            $eintragen = mysql_query($eintrag);   
     
echo mysql_error(); 
?>
 
Ich komme da nicht weiter.

Ich möchte ja nur noch das Original Bild in den ordner /images/ Kopieren.
 
Funky_MF hat gesagt.:
Dieser Schreibweise:
PHP:
"upload/images/$name"
ist diese hier vorzuziehen:
PHP:
"upload/images/".$name
Ich wuerde zwar von diesen beiden auch die 2. bevorzugen, aber es funktionieren beide, da PHP Strings die in "" stehen auch nach Variablen absucht.
Ich persoenlich wuerde es so machen:
PHP:
'upload/images/'.$name
So wird der String nicht unnoetig nach Variablen durchsucht.
 
Ok, ich habe einen upload geschrieben, der ganz dem entspricht was ich gelesn habe.
tHX @ Funky_MF

PHP:
<?
if (isset($_FILES)) 
  {
    for($i = 0; $i < count($_FILES['file']['tmp_name']); ++$i)
      {
        $tempname = $_FILES['file']['tmp_name'][$i];
        $name     = $_FILES['file']['name'][$i];
        if (is_uploaded_file($tempname))
          {
            move_uploaded_file($tempname,'foto/'.$name);
            echo 'Die Datei '.$name.' wurde erfolgreich hochgeladen!<br>';
          }
      }
 
   }
?>
Das klapt wunderbar, Das Foto wird im Original in den Ordner "foto" gespeichert.
Das Foto wird ja im array $_FILES übergeben.
Da dachte ich mir setzt du an das ende des Oberen scripts einfach ein zweites, doch da
habe ich wohl falsch Gedacht.
Was muss ich den machen, das ich am ende 2 verschiedene Fotos aus dem einen Hochgeladenen in verschiedenen Ordnern habe?
 
Zurück