janosch: multiple fileupload php - extensions unterscheiden

habe vor ein paar wochen schon mal geschieben und konnte etwas auf die beine stellen. leider läuft mein multiple file upload noch nicht sauber. hier der code soweit:

Fileupload start

for ($i=0;$i<4;$i++) //4 files sollen hoch {

if (is_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i]))    {       //extension herausfinden       $extention = substr(strrchr($files[$i], "."), 1);

switch($extention) {  case NULL :        {       $message = "extension nicht erkannt";       break;        }

case "jpg":         { if (file_exists($uploadpath."images/".$files[$i]))    {    $files[$i]=$zeit."_".$HTTP_POST_FILES['PIC']['name'][$i];           move_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i], $uploadpath."images/".$files[$i]);

$message="erfolgreich geupped";         }  break;}

case "mov":                  {      if (file_exists($uploadpath."images/".$files[$i]))    {

$files[$i]=$zeit."_".$HTTP_POST_FILES['PIC']['name'][$i];   $files[$i] = strtolower($files[$i]);   move_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i], $uploadpath."images/".$files[$i]); break;} } }

Fileupload ende

mein problem: die extension wird ausgelesen ist aber immer die extension vom upload-vorgang davor.

kann das an meinem sessions liegen?

//-----------------Session Management-------------------------- session_start(); // Wenn der Datei eine Session ID übergeben wurde, dann diese reaktivieren if (isset ($HTTP_GET_VARS[session_name()])) session_id( ${session_name()} );

freue mich über hilfe. schönen tag wünscht janosch

  1. Moin!

    Fileupload start

    for ($i=0;$i<4;$i++) //4 files sollen hoch
    {

    if (is_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i]))

    Hast du ein so altes PHP, dass du noch diese Altlast benutzen mußt? $_FILES ist schöner.

    {
          //extension herausfinden
          $extention = substr(strrchr($files[$i], "."), 1);

    Es gibt eine schöne PHP-Funktion namens pathinfo(), die dir auch die Extension einer Datei liefert.

    Aber spannende Frage: Woher kommt $files? Was steht da drin?

    switch($extention) {
     case NULL :
           {
          $message = "extension nicht erkannt";
          break;
           }

    Warum sind um den Block (und alle folgenden) geschweifte Klammern rum?

    case "jpg":
          { if (file_exists($uploadpath."images/".$files[$i]))
            {
              $files[$i]=$zeit."_".$HTTP_POST_FILES['PIC']['name'][$i];
              move_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i], $uploadpath."images/".$files[$i]);

    $message="erfolgreich geupped";
            }
     break;}

    case "mov":
                     {
         if (file_exists($uploadpath."images/".$files[$i]))
       {

    $files[$i]=$zeit."_".$HTTP_POST_FILES['PIC']['name'][$i];
      $files[$i] = strtolower($files[$i]);
      move_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i], $uploadpath."images/".$files[$i]);
    break;}
    }
    }

    Fileupload ende

    kann das an meinem sessions liegen?

    //-----------------Session Management--------------------------
    session_start();
    // Wenn der Datei eine Session ID übergeben wurde, dann diese reaktivieren
    if (isset ($HTTP_GET_VARS[session_name()])) session_id( ${session_name()} );

    Was soll der Scheiß denn? session_start() liest ganz automatisch GET-Parameter, Formulare und Cookies aus, um eine eventuell vorhandene Session-ID weiterzuverwenden.

    Das Setzen der Session-ID _nach_ dem Start der Session ist sinnlos, da ist schon eine Session-ID vergeben.

    Und was zum Teufel soll "session_id( ${session_name()} )" machen? Sieht eklig aus? Meint wahrscheinlich "session_id($_GET[session_name()])" - ist aber, wie erwähnt, überflüssig.
     - Sven Rautenberg

    --
    "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
    (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
    1. Fileupload start

      for ($i=0;$i<4;$i++) //4 files sollen hoch
      {

      if (is_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i]))

      Hast du ein so altes PHP, dass du noch diese Altlast benutzen mußt? $_FILES ist schöner.

      Stimmt schon. ich werde das mal ändern.

      {
            //extension herausfinden
            $extention = substr(strrchr($files[$i], "."), 1);
      Es gibt eine schöne PHP-Funktion namens pathinfo(), die dir auch die Extension einer Datei liefert.

      Aber spannende Frage: Woher kommt $files? Was steht da drin?

      das ist mein $files: $files=array($db->f("thumb"),$db->f("bild"));

      switch($extention) {
      case NULL :
             {
            $message = "extension nicht erkannt";
            break;
             }
      Warum sind um den Block (und alle folgenden) geschweifte Klammern rum?

      oh! danke

      case "jpg":
            { if (file_exists($uploadpath."images/".$files[$i]))
              {
                $files[$i]=$zeit."_".$HTTP_POST_FILES['PIC']['name'][$i];
                move_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i], $uploadpath."images/".$files[$i]);

      $message="erfolgreich geupped";
              }
      break;}

      case "mov":
                       {
           if (file_exists($uploadpath."images/".$files[$i]))
         {

      $files[$i]=$zeit."_".$HTTP_POST_FILES['PIC']['name'][$i];
        $files[$i] = strtolower($files[$i]);
        move_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i], $uploadpath."images/".$files[$i]);
      break;}
      }
      }

      Fileupload ende

      kann das an meinem sessions liegen?

      //-----------------Session Management--------------------------
      session_start();
      // Wenn der Datei eine Session ID übergeben wurde, dann diese reaktivieren
      if (isset ($HTTP_GET_VARS[session_name()])) session_id( ${session_name()} );

      Was soll der Scheiß denn? session_start() liest ganz automatisch GET-Parameter, Formulare und Cookies aus, um eine eventuell vorhandene Session-ID weiterzuverwenden.

      Das Setzen der Session-ID _nach_ dem Start der Session ist sinnlos, da ist schon eine Session-ID vergeben.

      Und was zum Teufel soll "session_id( ${session_name()} )" machen? Sieht eklig aus? Meint wahrscheinlich "session_id($_GET[session_name()])" - ist aber, wie erwähnt, überflüssig.

      • Sven Rautenberg

      danke sven ich werde dran arbeiten.

      1. Moin!

        if (is_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i]))
           {
              //extension herausfinden
              $extention = substr(strrchr($files[$i], "."), 1);
        das ist mein $files: $files=array($db->f("thumb"),$db->f("bild"));

        Ok, subsummiert zu einer dummen Frage:
        Wenn du Dateien hochladen läßt und deren Extension zu einer unterschiedlichen Behandlung führen soll - warum fragst du dann die Extension aus einem (offenbar) Datenbankergebnis ab, und nicht den vom Client gelieferten Originalnamen?

        Wenn die Datenbank nach dem Upload (und nach dem von dir geposteten Code) die Information des jeweiligen Uploads gespeichert kriegt, ist die Verzögerung der Reaktion um eine Seite irgendwie klar.

        - Sven Rautenberg

        --
        "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
        (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
        1. habe folgende funktion geschrieben:

          function getextension($filename)
          {
          $extension = pathinfo($filename);
          return $extension['extension'];
          }

          so kann ich die extension holen. klappt noch nicht.
          leider funktioniert die unterscheidung noch nicht.

          1. die unterscheidung mit der extension funktioniert jetzt. leider ist es wie sven schon sagte die extension vom vorherigem upload.

            ++++++++++++++++++++++++++++++++++++++++++++++
            $files=array($db->f("thumb"),$db->f("bild")); //kommt vom formular

            Bildupload start

            for ($i=0;$i<4;$i++)
            {

            if (is_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i]))
            {
            $extention = pathinfo($files[$i]);
            $extention = $extention[extension];

            switch($extention) {

            case NULL :
                   { // bla bla ...

            case "jpg:
                   { // bla bla ...
            ++++++++++++++++++++++++++++++++++++++++++++++

            1. Moin!

              die unterscheidung mit der extension funktioniert jetzt. leider ist es wie sven schon sagte die extension vom vorherigem upload.

              Nochmal: Wenn du prüfst, ob $HTTP_POST_FILES['PIC']['tmp_name'][$i] ein hochgeladenes File ist, wieso prüfst du dann die Extension dieses Dateinamens nicht, indem du $HTTP_POST_FILES['PIC']['name'][$i] checkst? Denn genau da steht die aktuelle Extension des hochgeladenen Files drin. Und nur die ist relevant!

              Alternativ zeigst du mir bitte, was die Methode $db->f macht. Wenn die NICHT die Extension aus $HTTP_POST_FILES['PIC']['name'][$i] holt, sondern vorher verarbeitete Werte aus der Datenbank holt, ist die Fehlerquelle eindeutig gefunden.

              $files=array($db->f("thumb"),$db->f("bild")); //kommt vom formular
              if (is_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i]))
              {
              $extention = pathinfo($files[$i]);
              $extention = $extention[extension];
                     switch($extention) {

              - Sven Rautenberg

              --
              "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
              (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
              1. sven es läuft. danke!!! ich poste den code noch schnell, will mich bedanken für die nette hilfe. tHX janosch.

                code (uploaded files unterscheiden):
                ++++++++++++++++++++++++++++++++++++++++++++++++

                Bildupload start

                for ($i=0;$i<4;$i++)
                {

                if (is_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i]))
                   {

                // Check Entension
                  $extention = pathinfo($HTTP_POST_FILES['PIC']['name'][$i]);
                  $extention = $extention[extension];

                // Weiche - was tun bei welchem file
                   switch($extention) {

                case NULL :
                       {
                      // bla bla
                         break;
                    }

                // Bildupload
                   case "jpg":
                       {
                  // bla bla
                ++++++++++++++++++++++++++++++++++++++++++++++++

                einige globale funktionen:

                function f($Name) {
                    return $this->strDatensatz[$Name];
                  }

  2. habe vor ein paar wochen schon mal geschieben und konnte etwas auf die beine stellen. leider läuft mein multiple file upload noch nicht sauber. hier der code soweit:

    Fileupload start

    for ($i=0;$i<4;$i++) //4 files sollen hoch
    {

    if (is_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i]))
       {
          //extension herausfinden
          $extention = substr(strrchr($files[$i], "."), 1);

    switch($extention) {
    case NULL :
           {
          $message = "extension nicht erkannt";
          break;
           }

    case "jpg":
            { if (file_exists($uploadpath."images/".$files[$i]))
       {
       $files[$i]=$zeit."_".$HTTP_POST_FILES['PIC']['name'][$i];
              move_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i], $uploadpath."images/".$files[$i]);

    $message="erfolgreich geupped";
            }
    break;}

    case "mov":
                     {
         if (file_exists($uploadpath."images/".$files[$i]))
       {

    $files[$i]=$zeit."_".$HTTP_POST_FILES['PIC']['name'][$i];
      $files[$i] = strtolower($files[$i]);
      move_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i], $uploadpath."images/".$files[$i]);
    break;}
    }
    }

    Fileupload ende

    mein problem: die extension wird ausgelesen ist aber immer die extension vom upload-vorgang davor.

    kann das an meinem sessions liegen?

    //-----------------Session Management--------------------------
    session_start();
    // Wenn der Datei eine Session ID übergeben wurde, dann diese reaktivieren
    if (isset ($HTTP_GET_VARS[session_name()])) session_id( ${session_name()} );

    freue mich über hilfe. schönen tag wünscht janosch

    Hallo janosch,

    Das ist so nicht richtig.

    Angenommen du hättest ein Formular der folgenden Art.

    <form enctype="multishit"> <!-- Nicht gerade sehr
    höflich, aber ich hasse Tipparbeit -->
    <input type="file" name="pic1" />
    <br>
    <input type="file" name="pic2" />
    <input type="file" name="pic3" />
    <input type="file" name="pic4" />

    </form>

    Wenn du diese Dateien hochladen möchtest, dann musst du folgendes Skript schreiben.

    foreach (array("pic1", "pic2", "pic3", "pic4") as $name)
    {
         $dateiname=irgendeineProzedur($name);
         move_uploaded_file($_FILES[$name]["tmp_name"],
                               $dateiname) or
         die("Das File konnte nicht aufgeladen werden! Fehler!");

    }

  3. Hello,

    if (is_uploaded_file($HTTP_POST_FILES['PIC']['tmp_name'][$i]))

    Und hier nochmal meine Anmerkung, dass die Verzweigung im Knotenelement "userfilename" steckt und nicht mit [$i] durchgezählt werden kann.

    lass Dir mal nach einem multiple Upload

    echo "<pre>";
    print_r($_FILES);
    echo "/<pre>";

    ausgeben. Dann sollte es klar werden.

    Grüße

    Tom

    1. Hello,

      echo "<pre>";
      print_r($_FILES);

      echo "</pre>";

      Grüße

      Tom

      1. das wird ausgegeben:

        Array
        (
            [PIC] => Array
                (
                    [name] => Array
                        (
                            [0] => ad_gr.jpg
                            [1] => test.mov
                            [2] =>
                            [3] =>
                        )

        [type] => Array
                        (
                            [0] => image/pjpeg
                            [1] => text/plain
                            [2] =>
                            [3] =>
                        )

        [tmp_name] => Array
                        (
                            [0] => /home/www/web797/phptmp/phpvsa3Ok
                            [1] => /home/www/web797/phptmp/phpNJmGSf
                            [2] =>
                            [3] =>
                        )

        [error] => Array
                        (
                            [0] => 0
                            [1] => 0
                            [2] => 4
                            [3] => 4
                        )

        [size] => Array
                        (
                            [0] => 15840
                            [1] => 319
                            [2] => 0
                            [3] => 0
                        )

        )

        )

        1. Hello und hoppla,

          das ist ja schon mal ein Stück näher zum Ziel.

          Gib doch bite nochmal das Formular <form> durch. Wie hast Du Deine inputs benannt?

          Grüße

          Tom