PHP Klasse/Methode für Uploadscript will nicht
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
bild
check
code
dank
datei
dateiname
fehler
galerie
image
inhalt
methode
objekt
paket
problem
test
type
url
verwenden
zeile
-
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; } } } ?>
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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
verwenden. Das betrifft die Zeilen 29, 40, 51, 61, 74 und 89.$this->fehler
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. -
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 „" .$wert. "“ 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 -
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:
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.
das ganze etwas "offener" zu gestalten
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 -
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage