Bild resize - need help

sheep87

Grünschnabel
Hallo zusammen... Der Upload funktioniert, was probleme macht ist das resizen...
Also es passiert gar nichts, darum meine Frage, was ist hier falsch?

PHP:
<?php
if ($_FILES["file"]["error"] > 0)
  {
  echo "Error: " . $_FILES["file"]["error"] . "<br />";
  }
else
  {
  echo "Datei erfolgreich hochgeladen!";
  echo "<p>";
  }

if (file_exists("/php/img/members/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
	      //resize
      $pfad = "img/members/resize/";
      $max_size = 500;
      $size = getimagesize($file); //Grösse auslesen
	
	if($size[0]>150 || $size[1]>150) {
		if($size[0] > $size[1]) { //Divisor der Seitenlängen bestimmen
			$divisor = $size[0] / $max_size; 
		} 
		else { 
			$divisor = $size[1] / $max_size; 
		} 
		$new_width = $size[0] / $divisor; //Neue Breite und Länge
		$new_height = $size[1] / $divisor; 
		settype($new_width, 'integer'); //Zahl in eine Integer runden
		settype($new_height, 'integer'); 
		$image_small = imagecreatetruecolor($new_width, $new_height); //Leeres Bild erstellen mit den neuen Massen
		$image = imagecreatefromjpeg($thefile); //Bild zwischenspeichern
		imagecopyresampled($image_small, $image, 0, 0, 0, 0, $new_width, $new_height, $size[0], $size[1]); //Das alte Bild auf die neuen Masse verkleinern
try {
imagejpeg($image_small, $pfad . $file, 100); //Das Bild . im Verzeichnis . mit Qualität . abspeichern
} catch(Exception $e) {
echo 'fehler' . $e;
}
	}
	//resize end
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "img/members/" . $_FILES["file"]["name"]);
      echo "file name: " . "img/members/" . $_FILES["file"]["name"];
      }
      

?>
 
Grundlegende Frage: Warum verwendest du ein Try-Catch-Statement, wo kein Fehler zum Fangen geworfen werden kann?
Zweite Frage: Dir ist hoffentlich bewusst, dass relative Pfade, wie du sie verwendest, irgendwie selten zum Ziel führen? Du kannst gerne mal überprüfen, ob der Pfad wirklich existiert - Gut möglich, dass eben dies nicht der Fall ist:

PHP:
var_dump($path = realpath("img/members/"));
var_dump(is_dir($path));

Verwende stattdessen besser absolute Pfadangaben, damit du sicher sein kannst, dass die Daten dort landen, wo sie sollen.

Nichtsdestotrotz mal ein paar kleine Vorabkorrekturen:

PHP:
<?php
if ($_FILES["file"]["error"] > 0) {
    echo "Error: " . $_FILES["file"]["error"] . "<br />";
} else {
    echo "Datei erfolgreich hochgeladen!";
    echo "<p>";
}

if (file_exists("/php/img/members/" . $_FILES["file"]["name"])) {
    echo $_FILES["file"]["name"] . " already exists. ";
} else {
    //resize
    $pfad = realpath("img/members/resize/"); // oder besser gleich den absoluten Pfad angeben!
    $max_size = 500;
    $size = getimagesize($file); //Grösse auslesen

    if ($size[0] > 150 || $size[1] > 150) {
        if($size[0] > $size[1]) {
            //Divisor der Seitenlängen bestimmen
            $divisor = $size[0] / $max_size; 
        } else {
            $divisor = $size[1] / $max_size; 
        }

        $new_width = $size[0] / $divisor; //Neue Breite und Länge
        $new_height = $size[1] / $divisor; 

        // Leeres Bild erstellen mit den neuen Massen
        $image_small = imagecreatetruecolor($new_width, $new_height);
        // Bild zwischenspeichern
        $image = imagecreatefromjpeg($thefile);
        //Das alte Bild auf die neuen Masse verkleinern
        imagecopyresampled($image_small, $image,
                           0, 0, 0, 0,
                           (int) $new_width,
                           (int) $new_height,
                           (int) $size[0],
                           (int) $size[1]);

        //Das Bild . im Verzeichnis . mit Qualität . abspeichern
        if (!imagejpeg($image_small, $pfad . $file, 100)) {
            echo 'fehler: Bild konnte nicht gespeichert werden';
        } else {
            //resize end
            move_uploaded_file($_FILES["file"]["tmp_name"], "img/members/{$_FILES['file']['name']}");
            echo "file name: 'img/members/{$_FILES['file']['name']}'";
        }
    }
}
 
ist das mit dem Pfad so ein Unterschied?
Danke für die schnelle Antwort und die Korrektur, aber jetzt wird das bild nicht mehr hochgeladen :S
 
Naja, angenommen dein Script liegt unter /srv/www/domain.de/httpdocs/action.php, und du rufst den Bild-Ordner über diesen Pfad auf: img/, dann sucht das Script höchstwahrscheinlich den Ordner /srv/www/domain.de/httpdocs/img/, was aber, wenn dein Script zB unter /srv/www/domain.de/httpdocs/files/action.php liegt? Dann sucht es den Ordner /srv/www/domain.de/httpdocs/files/img/, und so kann sich das dann ganz schnell tottreten - Zumal relative Pfadangaben "langsamer" sind, da sie erst reinterpretiert werden müssen.

Dazu kommt, dass durch diverse Includes die Pfadangaben sowieso nicht mehr hinhauen:
/srv/www/domain.de/httpdocs/index.php bindet /srv/www/domain.de/httpdocs/files/action.php ein, worin der Pfad img/ steht, so wird /srv/www/domain.de/httpdocs/img/ gesucht, wenn aber nur /srv/www/domain.de/httpdocs/files/action.php aufgerufen wird, sucht das Script nach /srv/www/domain.de/httpdocs/files/img/.

Dass das Bild nicht hochgeladen wird, liegt höchstwahrscheinlich an dieser Anweisung:
PHP:
$pfad = realpath("img/members/resize/");
oder
PHP:
        //Das Bild . im Verzeichnis . mit Qualität . abspeichern
        if (!imagejpeg($image_small, $pfad . $file, 100)) {
            echo 'fehler: Bild konnte nicht gespeichert werden';
        } else {
            //resize end
            move_uploaded_file($_FILES["file"]["tmp_name"], "img/members/{$_FILES['file']['name']}");
            echo "file name: 'img/members/{$_FILES['file']['name']}'";
        }

Wo der Fehler aber letztendlich wirklich auftritt, solltest du selbst herausfinden können mit [phpf]var_dump[/phpf] & [phpf]is_readable[/phpf], also zB is_readable($path).

Ach ja, eine Frage noch: ist das Zielverzeichnis für die Thumbnails auch beschreibbar? Sitzt die Rechtemaske also ordentlich (0777)?
 
Hallo,

da ich gerade exakt an dem Gleichen sitze wie Du, habe ich Dein Beispiel übernommen. Hoffe, das ist ok. Ausserdem umgehe ich damit mein ursprügliches Problem mit dem header.

Bei mir funktioniert der Upload ... allerdings ... der realpath wird in dieser Zeile

if (!imagejpeg($image_small, $pfad.$filename, 90)) {
echo 'fehler: Bild konnte nicht gespeichert werden';

komplett ignoriert. Statt dessen habe ich die Datei dann in Kleinformat im ursprüngllichen Ordner mit dem Namen "thumbOrginalname.endung" ....
Wenn es denn sein muss, geht das bei mir schon auch, lieber wäre mir, ich würde die Minis in einen neuen Ordner bekommen mit gleichem Dateinamen, also in '..prod/thumb' wie $pfad gespeichert und verwendet statt in '../prod'.

Muss ich dann ernsthaft nochmal die Datei auslesen und umbenennen?

Hier das (vereinfachte) Skript:

$uploaddir = '../prod/'; // Pfad wird vom aktuellen Ort der aufrufenden Datei gesucht
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . FILES['userfile']['name']))
{
if (file_exists($uploaddir.$_FILES['userfile']['name'])) {
echo " already exists. ";
$filepath = $uploaddir.$_FILES['userfile']['name'];
$filename = $_FILES['userfile']['name'];
$pfad = realpath($uploaddir."thumb");
$max_size = 100;
$size = getimagesize($filepath); //Grösse auslesen
if ($size[0] > 150 || $size[1] > 150) {
if($size[0] > $size[1]) {
//Divisor der Seitenlängen bestimmen
$divisor = $size[0] / $max_size;
} else {
$divisor = $size[1] / $max_size;
}//else
}//if size
$new_width = $size[0] / $divisor; //Neue Breite und Länge
$new_height = $size[1] / $divisor;
settype($new_width, 'integer'); //Zahl in eine Integer runden
settype($new_height, 'integer');

// Leeres Bild erstellen mit den neuen Massen
$image_small = imagecreatetruecolor($new_width, $new_height);

// Bild zwischenspeichern
$image = imagecreatefromjpeg($filepath);

//Das alte Bild auf die neuen Masse verkleinern
imagecopyresampled($image_small, $image,
0, 0, 0, 0,
(int) $new_width,
(int) $new_height,
(int) $size[0],
(int) $size[1]);

//Das Bild . im Verzeichnis . mit Qualität . abspeichern
if (!imagejpeg($image_small, $pfad.$filename, 90)) {
echo 'fehler: Bild konnte nicht gespeichert werden';
} // !imagejpg
}//if exist

[...]
} //if move_upload
 
Zurück