Probleme mit Upload-Script

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Probleme mit Upload-Script

    Hallo liebe Forenmitglieder,

    ich versuche gerade für ein Projekt ein Upload-Skript mit multipler Upload-Fuktion zu erstellen. Doch in der Logik und/oder im Syntax sind wohl einige Fehler drin, die mich einfach nicht weiter kommen lassen.

    Gedacht ist die Funktion wie folgt:

    upload.php
    ---------------------------------------------------------------------------------------------------
    1. Der User wählt die Anzahl gewünschter Uploads per DropDown-Liste
    2. Nach Knopfdruck schmeisst das Skript die entspr. Anzahl an Formular-Feldern raus
    3. Alle Felder werden vor der Übergabe an upload_file.php durch JS auf Vollständigkeit überprüft
    4. Sind alle Felder belegt bzw. mit Eintrag versehen, werden die Werte an upload_file.php übergeben

    upload_file.php
    --------------------------------------------------------------------------------------------------
    1. Nun wird in einer Schleife einzeln jeder Upload auf den richtigen Mime-Type überprüft. (in diesem Fall .swf oder .jpg)
    2. Sollte der Mime-type nicht stimmen, ist die Idee den Namen (realname) der Datei in einen Array zu schreiben und später die Dateinamen in der Fehlermeldung auszugeben.
    3. Ist der Typ richtig, wird im nächsten Schleifendurchgang auf richtige Größe der Datei geprüft. Ist die Datei zu groß, soll sie auch in den Fehlerarray geschrieben werden.
    4. Nur wenn beide Prüfungen erfolgreich durchlaufen wurden, wird die Datei in den Zielordner verschoben und der Name in einen Array geschrieben um später (Ausbau-Phase 2) einen DB-Eintrag zu generieren.
    5. Nach Durchlauf der Prüf-Schleife werden beide Array per Session-Variable an upload.php übergeben, um dort als Fehler- bzw. Erfolgsmeldung ausgegeben zu werden und anhand der Anzahl fehlerhafter Uploads neue Formularfelder zu generieren.

    Soweit zur Theorie! [Verunsichert]

    Folgender Fehler passieren:
    Es werden zwar immer alle richtigen Dateien in den Zielordner übertragen, aber die Ausgabe zur Information des Users stimmt nicht.
    Das Problem fängt an, wenn man richtige Dateien (richtiger Dateityp und Größe) mit falschen Dateien uploadet.

    Meist fehlen bei der Fehlerausgabe Dateinamen (in nachfolgender Ausgabe wurde versucht 4 Files zu uploaden :

    gespeicherte Files: images/italien_052006_0598_amalfi.jpg
    gespeicherte Files: images/italien_052006_1121_positan.jpg
    nichtgespeicherte Files:
    nichtgespeicherte Files: (un)Heiland.jpg

    Hier nun die Skripte zur Ansicht:


    upload.php
    -----------------------------------------------------------------
    PHP-Code:
    <?
        session_start();
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>

    </head>
    <body>
    <div id="gesamteBreite">
    <?
    require_once("safe/data.php");
        
        // Prüfen ob es schon einen fehlerhaften Uploadversuch gab
        // wenn nicht, dann normalen Upload-Dialog generieren
        // wenn doch, Anzahl gescheiterter Uploads protokolieren und entspr. Anzahl Formulare ausgeben
        
    if(empty($_SESSION['error']))
    {
        echo"<form name='uploadcount' action='$_PHPSELF' method='Post'>";
        echo"Ich möchte <select name='uploadcount'>";
        
        for($i=1; $i<=10; $i++){echo"<option value='$i'>$i</option>";}
        for($i=20; $i<=100; $i+=10){echo"<option value='$i'>$i</option>";}
        
        echo"</select> Datei(en) hochladen.";
        echo"<input type='submit' value='Formular generieren' />";    
        echo"</form>";
        echo"<div class='formular'>";
        echo"<form name='upload' enctype='multipart/form-data' action='upload_file.php' method='post' onSubmit='return checkform();'>";
        echo"<input type='hidden' value='".$_POST['uploadcount']."' name='count' />";
        echo"<table>";
        
        for($i=1; $i<=$_POST['uploadcount'];$i++)
        {    
            echo"<tr><td class='name'>Datei auswählen:</td><td class='feld'><input type='file' name='userfile[]'></td></tr>";
        }
        if(!empty($_POST['uploadcount'])) // Erst denn Upload-Button zeigen wenn eine Upload-Anzahl gewählt wurde
        {
        
            echo"<tr><td class='name'>&nbsp;</td><td class='feld'><input type='submit' value='Datei(en) hochladen' /><input type='reset' value='Reset' /></td></tr>";
            echo"</table>";
            echo"</form>";
            echo"</div>";
        }
    }
    else
    {    
        // ********************** -- Fehler- und Erfolgs-Ausgabe -- ***************************
        echo"<div id='error'>";
        echo $_SESSION['save']."<br /><br />";
        echo "Folgende Dateien wurden gespeichert:<br /><br />";
        for($i=0; $i<count($_SESSION['error']);$i++)    {
            
            echo $_SESSION['saved'][$i]."<br /><br />";
        }
        echo"Folgende Datei(en) wurden nicht gespeichert:<br /><br />";
        
        for($i=0; $i<count($_SESSION['error']);$i++)
        {
            echo $_SESSION['error'][$i]."<br /><br />";
        }
        
        echo"Entweder waren sie zu groß (max. 200 Kb) oder waren vom falschen Typ.";
        echo"</div><br />";
        
        // **********************************************************************
        
        echo"<div class='formular'>";
        echo"<form name='upload' enctype='multipart/form-data' action='upload_file.php' method='post' onSubmit='return checkform();'>";
        echo"<input type='hidden' value='".count($_SESSION['error'])."' name='count' />";
        echo"<table>";
        
        for($i=0; $i<count($_SESSION['error']); $i++)
        {    
            echo"<tr><td class='name'>Datei auswählen:</td><td class='feld'><input type='file' name='userfile[]'></td></tr>";
        }
        
        echo"<tr><td class='name'>&nbsp;</td><td class='feld'><input type='submit' value='Datei(en) hochladen' /><input type='reset' value='Reset' /></td></tr>";
        echo"</table>";
        echo"</form>";
        echo"</div>";

    ?>
    </div><!-- Ende #gesamteBreite -->
    </body>
    </html>
    upload_file.php
    --------------------------------------------------------------------
    PHP-Code:
    <?
        session_start();
        require_once("safe/data.php");

        $location="images/";
        $downloadlocation="../files/";
        $max_filesize=200000;


        /* --------- Uploads auf Größe und Mime-Type prüfen ---------- */
        $i=0;
        while($i<$_POST['count'])
        {
            if($_FILES['userfile']['type'][$i] != 'image/jpeg' and $_FILES['userfile']['type'][$i] != 'application/x-shockwave-flash')
            {

                $nonsaved_files[$i]=$_FILES['userfile']['name'][$i];
                $i++;
            }
            else
            {
                if($_FILES['userfile']['size'][$i] > $max_filesize)
                {
                    $nonsaved_files[$i]=$_FILES['userfile']['name'][$i];
                    $i++;
                }
                else
                {
                    // Files in richtigen Ordner verschieben
                    $success[$i]=move_uploaded_file($_FILES['userfile']['tmp_name'][$i], $location.$_FILES['userfile']['name'][$i]);
                    $saved_files[$i]=$location.$_FILES['userfile']['name'][$i];
                    $_SESSION['saved']=$saved_files[$i];
                    if($success[$i])
                    {
                        //$saved_files[$i]=$location.$_FILES['userfile']['name'][$i];
                        //$abfrage = "insert into pages values ('','$saved_files[$i]')";
                        //mysql_db_query($db, $abfrage, $con);

                    }
                    $i++;
                }
            }
        }

        for($i=0; $i<count($saved_files); $i++)
        {
            echo"gespeicherte Files: ".$saved_files[$i]."<br />";
        }
        for($i=1; $i<=count($nonsaved_files); $i++)
        {
            echo"nichtgespeicherte Files: ".$nonsaved_files[$i]."<br />";
        }

        // Erfolgsmeldung in Session speichern
        $_SESSION['save']="Es wurde(n) ".count($saved_files)." Seite(n) gespeichert!";
        // Fehler-Array an Session-Variable übergeben
        $_SESSION['error']=$nonsaved_files;
        //header("location:upload.php");
        exit();
    ?>
    Ich hoffe es kann mir jemand helfen, weil ich langsam verzweifle.

    Gruß aus Hannover,
    Alex

  • #2
    Joa Du machst glaube ich einen Fehler und zwar in upload_file.php

    check doch mal, welche Schluessel Deine Arrays wirklich haben, denn in der Zuordnung der Dateien in die verschiedenen arrays benutzt du einen zaehler fuer alle arrays.
    in deiner foreach schleife gehst Du aber von keys in Reihenfolge aus...
    for($i=0; $i<count(array);$i++)
    Beantworte nie Threads mit mehr als 15 followups...
    Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

    Kommentar


    • #3
      in deiner foreach schleife gehst Du aber von keys in Reihenfolge aus...
      Wie meinst Du das? Nach dem Hochzählen beende ich doch immer die Schleife. So sollten doch alle Indizies nacheinander gefüllt werden.

      Gruß Alex

      Kommentar


      • #4
        Ich hab nur etwas Struktur in dein Script reingebracht und die INDEXES nicht angefasst. So wie ich es verstanden hab ist es egal wann ein Fehler auftritt du musst nur wissen das einer bei einem File aufgetretten ist.

        Versuchsmal hiermit

        PHP-Code:
        $i 0;
        while(
        $i<$_POST['count']){
            if(
        $_FILES['userfile']['type'][$i] != 'image/jpeg' and $_FILES['userfile']['type'][$i] != 'application/x-shockwave-flash'){
                
        $nonsaved_files[]=$_FILES['userfile']['name'][$i];
            }
            else{
                if(
        $_FILES['userfile']['size'][$i] > $max_filesize){
                    
        $nonsaved_files[]=$_FILES['userfile']['name'][$i];
                }
                else{
                    
        // Files in richtigen Ordner verschieben
                    
        if(!move_uploaded_file($_FILES['userfile']['tmp_name'][$i], $location.$_FILES['userfile']['name'][$i])){
                        
        $nonsaved_files[]=$_FILES['userfile']['name'][$i];
                    }
                    else{
                        
        $saved_files[$i]=$location.$_FILES['userfile']['name'][$i];
                        
        $_SESSION['saved']=$saved_files[$i];
                    }
                }
            }
            
        $i++;
        }

        foreach (
        $saved_files as $v1){
            echo 
        "gespeicherte Files: $v1<br />";
        }
        foreach (
        $nonsaved_files as $v2){
            echo 
        "nichtgespeicherte Files: $v2<br />";
        }

        // Erfolgsmeldung in Session speichern
        $_SESSION['save']="Es wurde(n) ".count($saved_files)." Seite(n) gespeichert!";

        // Fehler-Array an Session-Variable übergeben

        $_SESSION['error']=$nonsaved_files;
        //header("location:upload.php");
        exit(); 
        Zuletzt geändert von DigitalDoener; 16.08.2006, 23:16.

        Kommentar


        • #5
          @DigitalDöner

          Vielen Dank, das hat´s gebracht! COOL
          Ich denke es lag an meiner Art per normaler for Schleife anstatt mit foreach auf die Arrays zuzugreifen, oder??

          Seeliger Gruß aus Hannover,
          Alex

          Kommentar

          Lädt...
          X