Bildinformationen heranziehen

N'abend,
Die Überschrift ist leider nicht sehr informativ, es ist aber auch ein schwer in wenigen Worten zusammenfassbares Problem.
Und zwar will ich einen kleinen Bilder upload machen.
Dabei hab ich folgendes Eingabefeld:
Code:
<html>
  <head>
    <title>
    Bilderupload
    </title>
  </head>
 <body>
  <form action="../upload.php" method="post" enctype="multipart/form-data">
    <h2>
      Neues Bild hinzufügen
    </h2>
    Person:   <input name="person" type="text" size="20" /><br />
    Ort:      <input name="ort" type="text" size="20" /><br />
    Datum:    <input name="datum" type="text" size="20" /><br />
    Fotograf: <input name="fotograf" type="text" size="20" /><br />
    Bild:     <input name="bild" type="file" size="20" accept="text/*" /><br />
              <input name="submit" type="submit" value="Bild hochladen" /><br />
  </form> 
 </body>
</html>
So jetzt will ich das in folgenden Skript verarbeiten:
PHP:
<html>
  <head>
    <title>
      Bildupload
    </title>
  </head>
 <body>
 <?php
  $server   = "localhost";
  $user     = "root";
  $password = "*****************";
  $database = "wales";
  
  if (isset($_POST['submit'])) {
  // Prüfen, ob Eingabe gemacht wurde
    if (empty($_POST['person']) AND empty($_POST['ort']) AND empty($_POST['datum']) AND empty($_POST['fotograf']) OR empty($_POST['bild'])) {
        echo "Eingabe inkorrekt!<br />";
        echo '<a href="../neu.php">Zurück</a>';
        exit();
        }
        mysql_connect($server, $user, $password, $database);
        if (file_exists($_POST['bild'])) {
            echo "Es gibt bereits ein Bild mit diesem Namen.";
        } else {
        copy($_POST['bild'], "../bilder/");
        echo "Das Bild".$_POST['bild']."wurde erfolgreich hochgeladen.";
        //jetzt noch thumbnail erstellen
        $ziel = $_POST['bild'];
        $pfad = "../thumb/";
        $size = getimagesize("../bilder/$ziel");
        $breite = $size[0];
        $hoehe  = $size[1];
        $neuehoehe = 70;
        $neuebreite = intval($breite*$neuehoehe/$hoehe);
        if ($size[2] == 2) {
            $altesbild = ImageCreateFromJPEG("../bilder/$ziel");
            $neuesbild = ImageCreate($neuebreite, $neuehoehe); 
            ImageCopyResized($neuesbild, $altesbild, 0, 0, 0, 0, $neuebreite, $neuehoehe, $breite, $hoehe);
            ImageJPEG($neuesbild, "../thumb/$bild");
        }
        // jetzt noch alles in der Datenbank speichern 
        $query = "INSERT INTO
                     wales_bilder (person, ort, datum, fotograf, bildpfad, thumbpfad)
                  VALUES ('".$_POST['person']."','".$_POST['ort']."','".$_POST['datum']."','".$_POST['fotograf']."', '../bilder/', '../thumb/');";
                      
        $result = mysql_query($query) OR die(mysql_error());
        echo "Es wurde nun noch ein Thumbnail erstellt und die nötigen Daten in die Datenbank geschrieben.<br />";
        echo '<a href="../neu.php">Ein weiteres Bild hochladen</a><br />';
        echo '<a href="../index.htm">Zurück zur Startseite.</a><br />';       
      }
  } else {
  echo 'Bitte benutze die <a href="../index.htm">Suchfunktion</a>';
  }
  
 ?> 
 </body>
</html>
Ich weiß auch schon wo der Fehler liegt, und zwar wenn ich OR empty($_POST['bild']) weg mache, funzt es mehr oder weniger einwandfrei ( es fehlt halt die variable im restlichen Skript. ).
Jedoch weiß ich sonst nicht, wie ich prüfen soll, ob eine Datei vorher ausgewählt wurden ist, und wie ich an die Bildmaße rankommen.
Ich habe schon probiert das ganze mit !isset() zu ersetzen (,da ich dachte es läge vielleicht am empty ), das ging aber auch nicht.
Danach hab ich nochmal bei selfhtml geguckt. Da steht als einzige 2 Bedingungen, dass es mit POST übergeben muss und im form stehen muss, dass es enctype="multipart/form-data" ist.
Wenn ich bei dem input der File die accept-Bedingung rausnehmen verändert sich trotzdem nichts.

Ich hoffe ihr könnt mir helfen.


0wnZ
 
Probiere mal:
Code:
if ($_FILES['bild']['name']) {


und wie ich an die Bildmaße rankommen.
Ich habe das in einem Uploadscript mal so gemacht:
Code:
$image=getimagesize($_FILES['bild']['tmp_name']);
$width=$image[0];
$height=$image[1];
 
Danke, es geht :)
Nur ein kleines Problemchen. Das Bild wird nicht gespeichert.
Soll heißen, es kopiert sich nicht in den Zielordner.
In der Datenbank hingegen wird alles richtig eingetragen.
mit copy(); sollte das doch funzen ?
 
Entschuldigung für die späte Antwort.
Leider funktioniert move_uploaded_file() nicht. Liegt es daran, dass ich es momentan noch lokal mit xampp ausprobiere ?
Mit is_ulpoaded_file()
habe ich geprüft, ob $_FILES['bild']['name']; eine hochgeladene Datei ist. die Funktion liefert FALSE.
Habe auch schon bei php.net bei Steurung von Dateiuploads, jedoch ohne Erflog :(.
Wäre dankbar für eine Idee.
 
Ich trage zwar nicht zur Lösung deines Problems bei, aber möchte dennoch sagen, dass das gesamte Script unsicher ist.

es wird keine einziege Usereingabe überprüft, angefangen von den sql querrys
Code:
VALUES ('".$_POST['person'].

bis zu dem format der datei (das man wirklich nur bilderformate uppen kann (.jpg, .gif, .png, ....) und keine php scripte oder ausführbare programme...

weiter brauche ich garnicht zu schauen, dass sind schonmal 2 sachen die mir direkt ins Auge gestochen sind, und auschon reichen um den Webspace unter kontrolle zu bekommen.


Ich denke mal da hast du noch einige szu verbessern

mfg
 
Ich werde es berücksichtigen. Eigentlich sollte das Skript nur solange auf dem Zielrechner bleiben, wie Bilder hochgeladen werden. Und dann bin ich dabei, oder es sind Leute am Werken, die davon keine Ahnung haben :).
Trotzdem gucke ich nochmal wegen den ganzen Eingaben. Um es einfach Idiotensicher zu machen. :)
 
Ich denke mal Du rufst die Funktion move_uploaded_file() falsch auf.

Beispiel:
PHP:
if (! move_uploaded_file($_FILES['bild']['tmp_name'], "../thumb/" . $_FILES['bild']['name'])) {
    die("Das Bild konnte nicht übertragen werden!");
}
 
Super, danke, das hat mir schon sehr geholfen.
Damit sind schonmal die Fehlermeldungen weg.
Das Problem, dass die Datei nicht in den dafür vorhergesehen Ordner kopiert wird bleibt.
Nochmal das Skript, wie es jetzt ist:
PHP:
<html>
  <head>
    <title>
      Bildupload
    </title>
  </head>
 <body>
 <?php
  $server   = "localhost";
  $user     = "root";
  $password = "xxxxxxxx";
  $database = "wales";
  
  if (isset($_POST['submit'])) {
  // Prüfen, ob Eingabe gemacht wurde
    if (empty($_POST['person']) AND empty($_POST['ort']) AND empty($_POST['datum']) AND empty($_POST['fotograf']) OR empty($_FILES['bild']['name'])) {
        echo "Eingabe inkorrekt!<br />";
        echo '<a href="../neu.php">Zurück</a>';
        exit();
        }
        mysql_connect($server, $user, $password, $database);
        mysql_select_db($database);
        if (file_exists($_FILES['bild']['name'])) {
            echo "Es gibt bereits ein Bild mit diesem Namen.";
        } else {
            $bild = $_FILES['bild']['name'];
            $hochladen = move_uploaded_file($_FILES['bild']['tmp_name'], "../bilder/");
            echo "Das Bild ".$_FILES['bild']['name']." wurde erfolgreich hochgeladen.";
             //jetzt noch thumbnail erstellen
            $pfad = "../thumb/";
            $size = getimagesize("../bilder/".$_FILES['bild']['name']);
            $breite = $size[0];
            $hoehe  = $size[1];
            $neuehoehe = 70;
            $neuebreite = intval($breite*$neuehoehe/$hoehe);
            if ($size[2] == 2) {
                $altesbild = ImageCreateFromJPEG($_FILES['bild']['tmp_name']);
                $neuesbild = ImageCreate($neuebreite, $neuehoehe); 
                ImageCopyResized($neuesbild, $altesbild, 0, 0, 0, 0, $neuebreite, $neuehoehe, $breite, $hoehe);
                ImageJPEG($neuesbild, "../thumb/");
                // jetzt noch alles in der Datenbank speichern 
                $query = "INSERT INTO
                            wales_bilder (person, ort, datum, fotograf, bildpfad, thumbpfad)
                          VALUES ('".$_POST['person']."','".$_POST['ort']."','".$_POST['datum']."','".$_POST['fotograf']."', '../bilder/', '../thumb/');";
                      
                $result = mysql_query($query) OR die(mysql_error());
                echo "Es wurde nun noch ein Thumbnail erstellt und die nötigen Daten in die Datenbank geschrieben.<br />";
            }
         echo '<a href="../neu.php">Ein weiteres Bild hochladen</a><br />';
         echo '<a href="../index.htm">Zurück zur Startseite.</a><br />';       
      }
  } else {
  echo 'Bitte benutze die <a href="../index.htm">Suchfunktion</a>';
  }
  
 ?> 
 </body>
</html>
PS: Sicherheit kommt, wenn das funktioniert.
 
Du hast Dir meine Antwort nicht genau genug angeschaut. :O
move_uploaded_file() weiss bei Dir ja nicht wie die Datei heißen soll.
 
Hat sich :)
Smash hat sich bereit erklärt und mir per icq geholfen.
BasivAvid auch :)
Trotzdem danke an alle.

Mit freundlichen Grüßen

0wnZ
 
Mir dünstet, Du versuchst mit Deinem Script auf ein Verzeichnis ausserhalb des DocumentRoot zuzugreifen.

Du willst ja mit Deinem ../bilder auf ein Verzeichnis ausserhalb des htdocs Verzeichnisses zugreifen. Böser Fehler!
Ändere mal in Deinen Dateien ../ in ./ um und probier es nochmal.
 
Jap, alles funktioniert jetzt.
Ich weiß, dass es momentan ziemlich unübersichtlich und unsicher ist.
Aber hier erstmal das vorläufige Skript, falls andere Leute genauso auf dem Schlau stehen wie ich:
PHP:
<?php
  $server   = "localhost";
  $user     = "root";
  $password = "xxxxxxxxxxxxx";
  $database = "wales";
  
  if (isset($_POST['submit'])) {
  // Prüfen, ob Eingabe gemacht wurde
    if (empty($_POST['person']) AND empty($_POST['ort']) AND empty($_POST['datum']) AND empty($_POST['fotograf']) 

OR empty($_FILES['bild']['name'])) {
        echo "Eingabe inkorrekt!<br />";
        echo '<a href="./neu.php">Zurück</a>';
        exit();
        }
        mysql_connect($server, $user, $password, $database);
        mysql_select_db($database);
        if(file_exists("./bilder/".$_FILES['bild']['name'])) {
            echo "Es gibt bereits ein Bild mit diesem Namen.";
        } else {            $bild = $_FILES['bild']['name'];
            $hochladen = move_uploaded_file($_FILES['bild']['tmp_name'], "./bilder/".$_FILES['bild']['name']);
            echo "Das Bild ".$_FILES['bild']['name']." wurde erfolgreich hochgeladen.";
             //jetzt noch thumbnail erstellen
            $size = getimagesize("./bilder/".$_FILES['bild']['name']);
            $breite = $size[0];
            $hoehe  = $size[1];
            $neuehoehe = 70;
            $neuebreite = intval($breite*$neuehoehe/$hoehe);
            if ($size[2] == 2) {
                $altesbild = ImageCreateFromJPEG("./bilder/".$_FILES['bild']['name']);
                $neuesbild = ImageCreateTrueColor($neuebreite, $neuehoehe); 
                ImageCopyResampled($neuesbild, $altesbild, 0, 0, 0, 0, $neuebreite, $neuehoehe, $breite, $hoehe);
		$thumbName = explode('.', $_FILES['bild']['name']);
		$thumbName = $thumbName[0] . '_thumb.' . $thumbName[1];
		ImageJPEG($neuesbild, "./thumb/" . $thumbName);
    $bildName  = $_FILES['bild']['name'];
                // jetzt noch alles in der Datenbank speichern 
                $query = "INSERT INTO
                            wales_bilder (person, ort, datum, fotograf, bildpfad, thumbpfad)
                          VALUES 

('".$_POST['person']."','".$_POST['ort']."','".$_POST['datum']."','".$_POST['fotograf']."', './bilder/$bildName', 

'./thumb/$thumbName');";
                      
                $result = mysql_query($query) OR die(mysql_error());
                echo "Es wurde nun noch ein Thumbnail erstellt und die nötigen Daten in die Datenbank 

geschrieben.<br />";
            }
         echo '<a href="./neu.php">Ein weiteres Bild hochladen</a><br />';
         echo '<a href="./bilder/'.$bildName.'">Das Bild angucken</a><br />';
         echo '<a href="./index.htm">Zurück zur Startseite.</a><br />';       
      }
  } else {
  echo 'Bitte benutze die Uploadskript. <br /> <a href="../index.htm">Zurück</a>';
  }
  
 ?> 
 </body>
</html>
Wenn ich Sicherheitslücken gestopft habe und es übersichtlicher ist, werde ich noch edit vornehmen :D

Danke nochmals :)
 
Zurück
Oben