kostenloser Webspace werbefrei: lima-city


PHP Klasse/Methode für Uploadscript will nicht

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    scriptserv

    scriptserv hat kostenlosen Webspace.

    Servus,

    also ich hab folgendes Problem...
    ich hatte ein Script mit mehreren Funktionen das ich jetzt in ne Klasse gepackt hab und versuchen will es zum laufen zu bekommen...

    Mein Problem ist jetzt, das die Methode "existiertBereinigtesBild"
    auf die Methode "clean" zugreifen soll,
    den Dateinamen bereinigen soll und das ganze dann zurück an "existiertBereinigtesBild" geben soll - nur das haut einfach nicht hin, egal wie ich es mache...

    Hat jemand hier vielleicht ne Lösung (oder einen Verbesserungsvorschlag) ?

    Dennis

    <form name="uploadformular" enctype="multipart/form-data" action="?content=upload" method="post">
        Datei: <input type="file" name="uploaddatei" size="60" maxlength="255" >
        <input type="Submit" name="submit" value="Datei hochladen">
    </form>
    
    <?php
    
    if ($_POST["submit"]){
        $test = new upload;
        $test->checkZugelassen();
        $test->richtigesBild();
        $test->existiertBild();
        $test->bildgroeße();
        $test->existiertBereinigtesBild();
        $test->uploadBild();
    }
    class upload
    {
        var $fehler = 0;
        
        function checkZugelassen()
        {
            $zugelasseneDateien = array("image/png", "image/jpeg", "image/gif", "image/jpg");
            if (! in_array($_FILES['uploaddatei']['type'], $zugelasseneDateien))
            {
                echo "<p>Dateityp ist nicht zugelassen. <br/>
                         Bitte laden Sie nur Dateien mit folgenden Endungen auf den Server: 
                         .jpg / .png / .jpeg / .gif</p>";
                $fehler = 1;
                exit;
            }
        }
        
        function richtigesBild()
        {
            $check = getimagesize($_FILES['uploaddatei']['tmp_name']);
            if($check != TRUE) 
            {
                echo "<p>Das Bild hat keinen Inhalt oder ist defekt</p>";
                $fehler = 1;
                exit;
            }
        }
        
        function existiertBild()
        {
            $exists = file_exists("./galerie/".$_FILES['uploaddatei']['name']);
            if($exists == TRUE)
            {
                echo "<p>Der Dateiname existiert bereits</p>";
                $fehler = 1;
                exit;
            }
         }
        
        function bildgroeße() 
        {
            if ($_FILES['uploaddatei']['size'] > 500000) 
            { 
                echo "<p> Ihre Datei ist leider zu groß</p>";
                $fehler = 1;
                exit;
            }
        } 
        
        function existiertBereinigtesBild() 
        {
            $this -> clean($_FILES['uploaddatei']['name']);     
            $exists2 = file_exists("./galerie/".$_FILES['uploaddatei']['name']);
        
            if($exists2 === TRUE)
            {
                echo "<p>Der Dateiname existiert bereits (Fehler2)</p>";
                $fehler = 1;
                exit;
            }
        }
        
        function clean()
        {
            $_FILES['uploaddatei']['name'] = strtolower  ($_FILES['uploaddatei']['name']);
            $_FILES['uploaddatei']['name'] = preg_replace('/[^A-Za-z0-9\-.]/', '', $_FILES['uploaddatei']['name']);
            $_FILES['uploaddatei']['name'] = str_replace (array(' ','ä','ö','ü','ß','Ä','Ö','Ü'), 
            array('-','ae','oe','ue','ss','Ae','Oe','Ue'), $_FILES['uploaddatei']['name']);  
            return ($_FILES['uploaddatei']['name']);
        }   
        
        function uploadBild() {
            if ($fehler = 0) 
            {	
                $name = $_FILES['uploaddatei']['name'];
                move_uploaded_file($_FILES['uploaddatei']['tmp_name'],'galerie/'.$name );
    
                echo "<p>Hochladen erfolgreich: ";	
                echo '<a href="galerie/'.$name.'">';	
                echo "$name";	
                echo '</a></p>';
                exit;
            }
            else
            {
                echo "<p>Beim Hochladen gab es ein Problem";	
                exit;
            }
        }
    }
    ?>
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ich hab' jetzt nicht genau nachgeforscht. Könnte es sein, dass die Leerzeichen vor/nach dem Operator ein Problem sind?
    Ansonsten wäre ne Fehlermeldung nicht schlecht bzw könntest du mal schauen, ob du zumindest bis in clean() kommst.
  4. Hallo scriptserv,

    zuerst einmal definierst du in Zeile 19 eine Eigenschaft der Klasse "upload":
    var $fehler = 0;
    Um jetzt innerhalb einer Methode auf diese Eigenschaft zuzugreifen, musst du
    $this->fehler
    verwenden. Das betrifft die Zeilen 29, 40, 51, 61, 74 und 89.
    Zu Zeile 89 gibt es noch etwas anderes zu sagen: Ein einfaches Gleichheitszeichem ist der Zuweisungsoperator. Um Werte miteinander zu vergleichen, musst du zwei Gleichheitszeichen verwenden. Korrekt sieht das dann so aus:
    if ($this->fehler == 0)
    Der Code funktioniert jetzt bei mir, hier nochmal vollständig:
    <form name="uploadformular" enctype="multipart/form-data" action="?content=upload" method="post">
        Datei: <input type="file" name="uploaddatei" size="60" maxlength="255" >
        <input type="Submit" name="submit" value="Datei hochladen">
    </form>
    
    <?php
    
    if ($_POST["submit"]){
        $test = new upload;
        $test->checkZugelassen();
        $test->richtigesBild();
        $test->existiertBild();
        $test->bildgroeße();
        $test->existiertBereinigtesBild();
        $test->uploadBild();
    }
    class upload
    {
        var $fehler = 0;
        
        function checkZugelassen()
        {
            $zugelasseneDateien = array("image/png", "image/jpeg", "image/gif", "image/jpg");
            if (! in_array($_FILES['uploaddatei']['type'], $zugelasseneDateien))
            {
                echo "<p>Dateityp ist nicht zugelassen. <br/>
                         Bitte laden Sie nur Dateien mit folgenden Endungen auf den Server: 
                         .jpg / .png / .jpeg / .gif</p>";
                $this->fehler = 1;
                exit;
            }
        }
        
        function richtigesBild()
        {
            $check = getimagesize($_FILES['uploaddatei']['tmp_name']);
            if($check != TRUE) 
            {
                echo "<p>Das Bild hat keinen Inhalt oder ist defekt</p>";
                $this->fehler = 1;
                exit;
            }
        }
        
        function existiertBild()
        {
            $exists = file_exists("./galerie/".$_FILES['uploaddatei']['name']);
            if($exists == TRUE)
            {
                echo "<p>Der Dateiname existiert bereits</p>";
                $this->fehler = 1;
                exit;
            }
         }
        
        function bildgroeße() 
        {
            if ($_FILES['uploaddatei']['size'] > 500000) 
            { 
                echo "<p> Ihre Datei ist leider zu groß</p>";
                $this->fehler = 1;
                exit;
            }
        } 
        
        function existiertBereinigtesBild() 
        {
            $this -> clean($_FILES['uploaddatei']['name']);     
            $exists2 = file_exists("./galerie/".$_FILES['uploaddatei']['name']);
        
            if($exists2 === TRUE)
            {
                echo "<p>Der Dateiname existiert bereits (Fehler2)</p>";
                $this->fehler = 1;
                exit;
            }
        }
        
        function clean()
        {
            $_FILES['uploaddatei']['name'] = strtolower  ($_FILES['uploaddatei']['name']);
            $_FILES['uploaddatei']['name'] = preg_replace('/[^A-Za-z0-9\-.]/', '', $_FILES['uploaddatei']['name']);
            $_FILES['uploaddatei']['name'] = str_replace (array(' ','ä','ö','ü','ß','Ä','Ö','Ü'), 
            array('-','ae','oe','ue','ss','Ae','Oe','Ue'), $_FILES['uploaddatei']['name']);  
            return ($_FILES['uploaddatei']['name']);
        }   
        
        function uploadBild() {
            if ($this->fehler == 0) 
            {	
                $name = $_FILES['uploaddatei']['name'];
                move_uploaded_file($_FILES['uploaddatei']['tmp_name'],'galerie/'.$name );
    
                echo "<p>Hochladen erfolgreich: ";	
                echo '<a href="galerie/'.$name.'">';	
                echo "$name";	
                echo '</a></p>';
                exit;
            }
            else
            {
                echo "<p>Beim Hochladen gab es ein Problem";	
                exit;
            }
        }
    }
    ?>

    Vorsicht:
    Prüfe, ob das hochgeladene Bild die zum Mime-Type passende Endung hat. Ohne diese Prüfung öffnest du eine fatale Sicherheitslücke, über die ein Hacker die komplette Seite lesen/verändern kann.
  5. Autor dieses Themas

    scriptserv

    scriptserv hat kostenlosen Webspace.

    Morgen ihr beiden,

    also die Lösung von fuerderer hilft schonmal gewaltig, danke!

    Bezüglich des Mime-Type werde ich mich nochmal schlau machen, danke für den Tipp

    Ich hab gestern allerdings schon wieder ne andere Idee gehabt das ganze etwas "offener" zu gestalten damit auch andere Scripte darauf zugreifen können... funktioniert soweit auch, nur die Prüfung am Ende haut nicht so ganz hin

    Bei der letzten Klasse soll geprüft werden ob $Fehler == 0, wenn das der Fall ist soll ein Upload stattfinden, ansonsten halt mit der Fehlermeldung abbrechen...

    Ich bedanke mich jetzt schon mal für eure Hilfe :)

    <form name="uploadformular" enctype="multipart/form-data" action="" method="post">
        Datei: <input type="file" name="uploaddatei" size="60" maxlength="255" >
        <input type="Submit" name="submit" value="Datei hochladen">
    </form>
    
    <?php
    
    if ($_POST["submit"]){
        $test = new checkEndung;
        $test ->endung($_FILES['uploaddatei']['type']);
        
        $test = new checkEchtesBild;
        $test ->bild($_FILES['uploaddatei']['tmp_name']);
         
        $test = new checkExist;
        $test ->existiertBild($_FILES['uploaddatei']['name']);
        
        $test = new checkBildgroeße;
        $test ->bildgroeße($_FILES['uploaddatei']['size']);
    
        $test = clean($_FILES['uploaddatei']['name']);
        
        $test = new checkExistBereinigt;
        $test ->existiertBereinigtesBild($_FILES['uploaddatei']['name']);
        
        $test = new upload;
        $test ->uploadBild($_FILES['uploaddatei']['name']);
    }
    
    class checkFehler
    {
        var $fehler = 0;
    }
    
    class checkEndung extends checkFehler
    {
        function endung($wert)
        {
            $zugelasseneDateien = array("image/png", "image/jpeg", "image/gif", "image/jpg");
            if (! in_array($wert, $zugelasseneDateien))
            {
                echo "<p>Dateityp ist nicht zugelassen. <br/>
                         Bitte laden Sie nur Dateien mit folgenden Endungen auf den Server: 
                         .jpg / .png / .jpeg / .gif</p>";
                $this->fehler = 1;
            }
        }
    }
    
    class checkEchtesBild extends checkFehler
    {
        function bild($wert)
        {
            $check = getimagesize($wert);
            if($check != TRUE) 
            {
                echo "<p>Das Bild hat keinen Inhalt oder ist defekt</p>";
                $this->fehler = 1;
            }
        }
    }
        
    class checkExist extends checkFehler
    {
        function existiertBild($wert)
        {
            $exists = file_exists("../galerie/".$wert);
            if($exists == TRUE)
            {
                echo "<p>Der Dateiname &bdquo;" .$wert. "&ldquo; existiert bereits</p>";
                $this->fehler = 1;
            }
         }
    }
    
    class checkBildgroeße extends checkFehler
    {
        function bildgroeße($wert) 
        {
            if ($wert > 500000) 
            { 
                echo "<p> Ihre Datei ist leider zu groß</p>";
                $this->fehler = 1;
            }
        } 
    }
    
    class checkExistBereinigt extends checkFehler
    {    
        function existiertBereinigtesBild($wert) 
        {
            $exists2 = file_exists("../galerie/".$wert);
        
            if($exists2 === TRUE)
            {
                echo "<p>Der Dateiname existiert bereits (Fehler2)</p>";
                $this->fehler = 1;
            }
        }
    }
    
    function clean(){
        $_FILES['uploaddatei']['name'] = strtolower  ($_FILES['uploaddatei']['name']);
        $_FILES['uploaddatei']['name'] = preg_replace('/[^A-Za-z0-9\-.]/', '', $_FILES['uploaddatei']['name']);
        $_FILES['uploaddatei']['name'] = str_replace (array(' ','ä','ö','ü','ß','Ä','Ö','Ü'), 
        array('-','ae','oe','ue','ss','Ae','Oe','Ue'), $_FILES['uploaddatei']['name']);  
        return ($_FILES['uploaddatei']['name']);
    }
    
    class upload extends checkFehler
    {
        function uploadBild($wert) {
            if ($this->fehler == 0) 
            {
                move_uploaded_file($_FILES['uploaddatei']['tmp_name'],'../galerie/'.$wert );
    
                echo "<p>Hochladen erfolgreich: ";	
                echo '<a href="../galerie/'.$wert.'">';	
                echo "$wert";	
                echo '</a></p>';
            }
        }
    }
    
    
    ?>


    Beitrag zuletzt geändert: 5.2.2016 11:55:18 von scriptserv
  6. michaelkoepke

    michaelkoepke hat kostenlosen Webspace.

    Hallo scriptsev,

    Dein erster Code hat dich schon in Richtung deines Ziels gebracht, jedoch dein zweiter lässt dich wenden und du läufst zurück.

    Warum funktioniert es nicht? Du erstellst mit "new" ein neues Objekt der Klasse "checkEndung" wenn du dir das vorstellst, packst du nun ein Packet mit dem Inhalt aus deren Klasse sowie der Klasse "checkFehler".
    Als nächstes öffnest du dein Paket und führst eine Aktion "endung" aus und schließt es wieder.

    Nun erstellst du ein neues (um bei dem Bild oben zu bleiben) Paket mit dem gleichen Namen. Somit ist dein erstes Paket weg. Das neue Paket wird nun wiederum mit der Klasse "checkEchtesBild" sowie "checkFehler" verpackt.

    Und so weiter...

    Somit gibt es, wenn du den letzten Check machst nur ein Paket und die Variable "fehler" wird wieder von der Klasse "checkFehler" mit 0 verpackt. Somit kann sie vorher x-Zustände haben, jedoch am Ende nur einen und der ist 0.

    Die Lösung, wirst du denken, ist nun einfach jedes Objekt in eine eigene Variable zu speichern, somit hast du alle "Pakete" vor dir stehen. ABER! Die Pakete sind verschlossen. Nun wirst du verstehen, dass deine Pakete, da sie verschlossen sind, nicht untereinander kommunizieren können. Dazu brauchst du sogenannte Setter und Getter Methoden, die dir Werte in deine Pakete hineinpacken bzw. zurückgeben.
    Zum Beispiel: get_fehler() oder set_fehler, was du in jedem Objekt aufrufen müsstest.

    Die nächste Lösung ist die einfachste, und sie entspricht deinem ersten Code!

    Du erstellst EIN Paket der Klasse "FileHandler" (um sie evtl. woanders noch zu verwenden) dies wird gepackt mit allen benötigten Variablen und Methoden. Somit kannst du innerhalb dieses Paketes die definierten Variablen verwenden.

    Um nun
    scriptserv schrieb:
    das ganze etwas "offener" zu gestalten
    wie du sagst, solltest du deine Klasse auch allgemein halten, zum Beispiel "upload", "check_X", "check_Y", ..., "save", "error", usw. somit kannst du sie immer wieder verwenden. Brauchst du nun aber neue spezielle Methoden, dann schreibe diese Klasse nicht um sondern erstelle eine neue mit den neuen Methoden und erbe von der großen Klasse, schon kommst du wieder in den Genuss alle deine Methoden verwenden zu können.

    Wenn du noch Infos über OOP möchtest (zum Beispiel über public, private, protected), kann ich dir nur Peter Kropff empfehlen.

    Viele Grüße
    Michael

    Beitrag zuletzt geändert: 8.2.2016 20:51:02 von michaelkoepke
  7. Autor dieses Themas

    scriptserv

    scriptserv hat kostenlosen Webspace.

    Hallo Michael,

    erst einmal Danke für die Erklärung, das war der Denkanstoß der mir gefehlt hat.

    Okay, dann also wieder zurück zur ersten Lösung und diese dann weiter bearbeiten.

    Mit der Seite von Peter Kropff habe ich das alles erst gelernt, konnte es nur noch nicht ganz so Umsetzen, muss mich nochmal weiter hineinversetzen in das ganze Thema.

    Danke auf jeden Fall für die Hilfe,

    Gruß Dennis
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!