1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Fileupload mit PHP

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von Chuck-.-, 29.04.07.

  1. Chuck-.-

    Chuck-.- Bismarckapfel

    Dabei seit:
    22.12.06
    Beiträge:
    142
    Hey

    Zurzeit bin ich am Experimentieren bezüglich eines Fileupload Systemes das mit PHP programmiert werden soll.
    In PHP selbst habe ich schon eigentlich schon einige Erfahrungen und bin auch verwundert warum mein Script nicht funktinieren will. Hab shon edliche Beispiel dazu durchgelesen.
    Das Script sollte eigentlich nur eine Datei in den Ordner "uploads/bilder" speichern. Was aber schon von Anfang an nicht funktionieren will ist das "move_uploaded_file". PHP gibt mir hier schon den Wert FALSE zurück. Hab noch nie etwas in die richtung Fileuploading Programmiert und habe deshlab auch keine ahnung was ich machen soll.
    Wenn mir jemand einen Tipp hat wär ich froh.

    Code:
    <?php
    $content .= '<form enctype="multipart/form-data" action="'. $_SERVER['PHP_SELF'] .'" method="post">
    <input type="hidden" name="max_file_size" value="1000">
    file senden: <input name="file" type="file">
    <input type="submit" value="senden">
    </form>
    ';
                 
    $download = move_uploaded_file($filename_name , "uploads/bilder/".$filename_name);
    var_dump($download);
    
    echo $content; 
    ?>
    Grüße Jannik
     
    #1 Chuck-.-, 29.04.07
    Zuletzt bearbeitet: 30.04.07
  2. zeno

    zeno Lane's Prinz Albert

    Dabei seit:
    05.11.05
    Beiträge:
    4.898
    haben die ordner die richtigen rechte? darf der webserver datein in den upload ordner schreiben?
     
    Chuck-.- gefällt das.
  3. Chuck-.-

    Chuck-.- Bismarckapfel

    Dabei seit:
    22.12.06
    Beiträge:
    142
    Ja alles auf 777
     
  4. Hobbes_

    Hobbes_ Gast

    Hallo Jannik,

    Das mit dem upload ist immer so eine Sache und kann verschiedene Sicherheitsrisiken beinhalten, die Du abfangen musst. Dies nur so nebenbei. Daneben ist es jedoch eine praktische Sache und funktioniert problemlos :)

    In Deinem Script hat es gleich mehrere Fehler drin. Zuerst noch eine Frage: Du hast den Inhalt des Formulars, das den upload auslösen soll und dann die Auswertungsfunktion in einen einzelnen <?PHP ?> gestellt. Ich hoffe, dass Du dies nur zur Illustration für uns gemacht hast, sonst wäre das gleich einer der Fehler. Daneben könten auch die Parameter in move_uploaded_file ein Problem sein, wenn Du sie nicht vorgängig korrekt initialisiert hast.

    Kurz: Ich empfehle Dir mal das Beispiel von hier zu übernehmen (php.net; jedoch Anpassung der Pfade an Deine Server-Situation) und die Dokumentation gut zu lesen zu den betreffenden Funktionen und Parametern. Erst wenn Du das verstanden hast, kannst Du einfach die für Dich passenden Modifikationen machen.

    Daneben ist es für uns einfacher zum lesen, wenn Du den Code mit dem Code-Block umfasst (siehe das # Symbol in apfeltalks Editor) statt dem Zitat-Symbol. Danke.

    Viel Erfolg!
    psc
     
    #4 Hobbes_, 29.04.07
    Zuletzt von einem Moderator bearbeitet: 29.04.07
  5. zeno

    zeno Lane's Prinz Albert

    Dabei seit:
    05.11.05
    Beiträge:
    4.898
    Und was sagt dir php als konkrete Fehlermeldung? hast du error_reporting an?
     
  6. Sir Q

    Sir Q Rheinischer Winterrambour

    Dabei seit:
    12.04.05
    Beiträge:
    921
    <input type="hidden" name="max_file_size" value="1000">
    Scheint mir 'n bisschen wenig zu sein - 1000bytes sind fast nix …
     
    Chuck-.- gefällt das.
  7. Chuck-.-

    Chuck-.- Bismarckapfel

    Dabei seit:
    22.12.06
    Beiträge:
    142
    Hey danke für die vielen Antworten.

    Den Code den ich euch gepostet habe ist so zimlich alles was was ich habe. Natürlich ist alles noch in eine HTML Datei gepackt aber sonst ist da nicht arg viel mehr.

    "Hobbes" ;) wie hast du das bemeint mit dem initialisieren?

    Den max_file_size hab ich auch mal auf 30000 hochgeschraubt.

    error_reporting liefert keinen Wert zurück. Da wird aber der Fehler auf meiner Seite liegen da ich keine Ahnung habe wie ich mit dem error_reporting umgehen muss.

    Hab mir das Fileupload erlichgesagt leichter Vorgestellt. Das demotiviert einen zimlich wenn man doch schon einges mit PHP entwickelt hat und dann bei soetwas hängen bleibt :(


    PS: Die sicherheit des Scriptest ist vorerst zweitrangig. Ist nur zur übung und wird später bezüglich der Sicherheit geprüft ;)
     
  8. Sir Q

    Sir Q Rheinischer Winterrambour

    Dabei seit:
    12.04.05
    Beiträge:
    921
    lass dir mal beim Upload einer kleinen Datei mit unverfänglichem Namen das folgendes ausgeben:

    <pre>
    print_r($_POST);
    print_r($_FILES);
    </pre>


    und poste das hier mal …
     
  9. Chuck-.-

    Chuck-.- Bismarckapfel

    Dabei seit:
    22.12.06
    Beiträge:
    142
    Code:
        int(2) Array (     [max_file_size] => 30000 ) Array (     [file] => Array         (             [name] => Bild 5.png             [type] =>              [tmp_name] =>              [error] => 2             [size] => 0         )  )
    
    Das kommt dabei raus. War mir aber bekannt. Nur in $_FILES['file']['error'] steht 2 drin. was hat das zu bedeuten?
     
  10. Sir Q

    Sir Q Rheinischer Winterrambour

    Dabei seit:
    12.04.05
    Beiträge:
    921
    Da in [size] => 0 nix drinn steht - würd ich darauf tippen, datei zu groß beim senden …
     
  11. Hobbes_

    Hobbes_ Gast


    Hallo Jannik,

    Tja, am Fileupload kann man wirklich die Zähne ausbeissen :) Deshalb habe ich Dir zuerst den Link auf ein gut funktionierendes Beispiel geschickt, so dass Du mal schauen kannst, wie es funktioniert und das ganze dann modifizieren kannst...


    Vielen Dank übrigens für die neue Darstellung. So kann man den Code deutlich besser lesen :)

    zu 1: Wenn das der ganze Code ist, dann entspricht dies genau einem konzeptionellen Problem. Du benötigst im Prinzip 2 Dateien: Ein Formular mit den Formulardaten, mit dem Du die Datei auswählst und dann hochlädst und eine zweite Datei, welche dann den upload auswertet. Alternativ kannst Du dies natürlich auch durch Parameter in einem PHP-File machen, zB mit
    Code:
    test.php?function=upform
    test.php?function=upload
    wobei Du dann je nach Parameter eine andere Ausgabe zurückschickst.

    Selbstverständlich kannst du dann im Verlauf eine Kombination machen (upload verarbeiten und gleich neues Form zurücksenden. Doch würde ich initial aus didaktischen Gründen eine strikte Trennung in zwei separate Elemente empfehlen, bis es mal funktioniert.

    So ist auch das Beispiel auf obenstehendem Link zu verstehen. Hast du das mal ausprobiert? Ist sehr empfehlenswert. Da es genau so funktioniert... (wirklich, kein Scherz!)

    Die anderen Helfer im Forum haben Dir auch schon mal die Bedeutung der globalen Variablen gezeigt, die eben alle Infos mittragen, die Du zum Auswerten im Skript benötigst. Versuche mal das Beispiel aus und versuche die einzelnen Schritte und Parameter zu verstehen...


    zu 2: Wie hast du meinen Kosenamen erraten. o_O So werde ich eigentlich am liebsten genannt :)
    Mit initialisieren meinte ich eben, dass Du private Variablen $filename_name verwendest, jedoch nirgends einen Bezug zur globalen Variablen $FILES[] machst, die Du zum korrekten Auswerten der notwendigen Informationen brauchst. Auch diesbezüglich verweise ich erneut auf das funktionierende Beispiel auf der php.net Seite. Diese Beispiele sind wirklich sehr lehrreich!!!


    Zu 3: Da kannst du ruhig noch höher gehen. Gerade Bilddateien benötigen viel Speicherplatz (momentan gibst Du nicht mal 30 KB frei...). Du kannst eigentlich im Teststadium nicht zu hoch gehen. Wenn die Datei zu lange ist, als dass sie während der maximalen Laufzeit des Skripts hochgeladen werden könnte (meist 30s oder so -- max. mögliche Dateigrösse also unter anderm auch von upload-Geschwindigkeit des Modems abhängig) dann kommt dann schon ein Error (timeout)... mach ruhig mal 3000000 oder noch höher...

    Zu 4: Ja das dauerte auch bei mir zuerst lange - gerade weil ich mich nicht auf das einfache Beispiel einlassen wollte und es direkt komplizierter probieren wollte :) Gleicher Fehler, wie Du :)
    Das kommt dann schon noch - bald bist Du unser upload Experte und schreibst ein eigenes kleines Tutorial...

    Zu 5: Gleiche Meinung! Vergiss es später jedoch nicht, noch zu machen!


    Letztlich bleibt meine Empfehlung dieselbe: Probier mal das oben verlinkte Beispiel aus mit zwei Dateien (ein Form und und ein upload-Auswerter; beachte, dass der Name im Form [im Beispiel 'userfile' genannt] identisch sein muss mit dem Namen, den Du in der globalen Variablen $FILES in der Klammer benötigst. Du kannst den Namen frei wählen - jedoch muss der Name übereinstimmen!).
    Nebenbei: So kannst du übrigens auch mehrere Dateien miteinander übertragen: Nutze mehrere dieser Formularelemente mit verschiedenen Bezeichnern und werte dann alle im upload aus.

    Beachte wirklich all diese kleinen Details und der Erfolg möge mit Dir sein (wie wohl andere Kreaturen sagen würden).

    Ich leg mich mal wieder ans Kaminfeuer
    Hobbes :)
     
    #11 Hobbes_, 30.04.07
    Zuletzt von einem Moderator bearbeitet: 30.04.07
  12. Chuck-.-

    Chuck-.- Bismarckapfel

    Dabei seit:
    22.12.06
    Beiträge:
    142
    Juhu jetzt eght alles :)
    Danke für eure Hilfe. Jetzt wird erstmal Karma verteilt. Bin richtig Glücklich.
     
  13. duderino

    duderino Goldparmäne

    Dabei seit:
    26.01.06
    Beiträge:
    556
    Hab da auch mal ne kleine Frage zum Upload. Bin gerade dabei ein Projekt zu planen bei dem man auch Bilder auf den Server hochladen kann. Da die "normale" PHP Upload Methode jedoch ein bisschen umständlich ist, um mehrere Bilder zu laden, habe ich mich entschieden auf Ajax bzw. ein Massenuploaden zurückzugreifen.

    Da man da Pearl usw. benötigt, kann ich es leider nicht selbst programmieren. Kennt jemand von euch ein gutes fertiges Script für solche Uploads?


    duderino
     
  14. Hilarious

    Hilarious Gelbe Schleswiger Reinette

    Dabei seit:
    10.08.05
    Beiträge:
    1.759
    Wenn Du die Möglichkeit hast, die aktuellste PHP5-Version zu nutzen, findest Du damit auch die Möglichkeit soetwas ohne Perl umzusetzen.
     
  15. duderino

    duderino Goldparmäne

    Dabei seit:
    26.01.06
    Beiträge:
    556
    Ja, die Funktion kenn ich. Leider muss ich mit PHP 4 entwickeln. Habe jetzt aber ein geeignetes Script gefunden das fast allen meinen Anforderungen entspricht.

    http://uber-uploader.sourceforge.net/
     
  16. Hobbes_

    Hobbes_ Gast

    Sehr schön :)
    Ich freue mich sehr.

    Nun nur noch die kleine Erinnerung an Punkt 5 :)

    Viel Erfolg für Deine Projekte...
    Hobbes (psc)
     
  17. Sir Q

    Sir Q Rheinischer Winterrambour

    Dabei seit:
    12.04.05
    Beiträge:
    921
    Massen-Upload mit PHP - selbst mit bordmitteln kein problem:

    <input name="myfile[1]" type="file" size="50" accept="*/*">
    <input name="myfile[2]" type="file" size="50" accept="*/*">
    <input name="myfile[3]" type="file" size="50" accept="*/*">
    <input name="myfile[4]" type="file" size="50" accept="*/*">
    <input name="myfile[5]" type="file" size="50" accept="*/*">


    Du bekommst dann ein nettes array mit den einzelnen files …
     

Diese Seite empfehlen