snr: Gemischte <FORM>- Eingaben

Hallo da draussen,
Nachdem ich für die Gestaltung unserer Homepage bisher immer Hilfe im selfHTML- Buch bzw. in den Forenarchiven gefunden habe, hätte ich da mal eine Frage:

Ich möchte folgendes realisiren:

  • es gibt eine Seite (in einem gechützten Bereich der Homepage), die mehrere
      Eingabefelder enthält
  • in die Eingabefelder (Textfelder und Auswahlfelder) sollen Informationen
      eingetragen und zusätzlich noch Bilder hochgeladen werden können
  • alles, sowohl der Text als auch die Bilder sollen mit nur einem "Submit"-
      Knopf abgeschickt werden!

Was schon geht:

Ich kann den Text übertragen, auswerten, und abspeichern, sowie auslesen und auf einer neuen Seite anzeigen. Ich kann auch die Bilder hochladen, aber beides zusammen geht natürlich nicht.

Was nicht geht:
Wenn ich in das <FORM>- Tag den "enctype=multipart/form-data" setze, dann kann ich die Texteingaben nicht mehr decodieren, da ja das ganze im Uploadmodus übertragen wird. Ich bekomme dann nur in der ersten Variablen alle Form- Daten (nicht dekodiert) und danach die Bilddaten.

Man könnte das natürlichmit fertiger Software realisieren,aber ich möchte es lernen und unssre kleine Gebrauchtmaschinenbörse selbst programmieren.
Also bitte keine diesbezüglichen Hinweise, es gibt sowas sicher schon...

MfG
SNR

  1. Hi,

    Wenn ich in das <FORM>- Tag den "enctype=multipart/form-data" setze, dann kann ich die Texteingaben nicht mehr decodieren, da ja das ganze im Uploadmodus übertragen wird. Ich bekomme dann nur in der ersten Variablen alle Form- Daten (nicht dekodiert) und danach die Bilddaten.

    dann ist Deine Auswertung falsch.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      Wenn ich in das <FORM>- Tag den "enctype=multipart/form-data" setze, dann kann ich die Texteingaben nicht mehr decodieren, da ja das ganze im Uploadmodus übertragen wird. Ich bekomme dann nur in der ersten Variablen alle Form- Daten (nicht dekodiert) und danach die Bilddaten.

      dann ist Deine Auswertung falsch.

      Cheatah

      @Cheatah:
      Danke für die schnelle Antwort! Ich verstehe das erstmal so, dass man die Daten so übertragen kann (gemischt: binär und text)?

      Hier mal einen kurzen Ausschnitt aus den ersten "Auseinanderfummlen" der Daten:

      -----------------------------------------------------  
      # Variablen  
      ...  
      #  
      # Einlesen der vom Formular uebermitteleten Daten  
      #  
      if ($ENV{'REQUEST_METHOD'} eq "POST")  
       {  
        read(STDIN, $form_data, $ENV{'CONTENT_LENGTH'});  
       }  
      else  
       {  
        $form_data = $ENV{'QUERY_STRING'};  
       }  
      #  
      # Daten decodieren  
      #  
      #  Daten Splitten (nach Trenner "&")  
      @data_split = split(/\&/,$form_data);  
      #  
      #  Trennen der Eingabedaten von den Bezeichnungen  
      $i = 0;  
      foreach(@data_split)  
       {  
        ($data_var[$i],$data_write[$i]) = split(/\=/,$data_split[$i]);  
        $i++;  
       }  
      ......  
      ---------------------------------------
      

      Ist da schon ein kapitaler Fehler? Denn in "$data_write[$i]" kommen die Bilddaten ab Indexposition $i=<1 an.
      Wenn ich den "enctype" weglasse, dann funktioniert das, aber es kommen natürlich nur die Pfad-/Dateinamen der Bilder in der Variable an, logisch!

      MfG
      SNR

      1. Hi,

        Danke für die schnelle Antwort! Ich verstehe das erstmal so, dass man die Daten so übertragen kann (gemischt: binär und text)?

        ja.

        Hier mal einen kurzen Ausschnitt aus den ersten "Auseinanderfummlen" der Daten:
        if ($ENV{'REQUEST_METHOD'} eq "POST")

        Sag ich ja. Benutze das Modul "CGI".

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hi,

          Danke für die schnelle Antwort! Ich verstehe das erstmal so, dass man die Daten so übertragen kann (gemischt: binär und text)?

          ja.

          Hier mal einen kurzen Ausschnitt aus den ersten "Auseinanderfummlen" der Daten:
          if ($ENV{'REQUEST_METHOD'} eq "POST")

          Sag ich ja. Benutze das Modul "CGI".

          Cheatah

          @Cheatah:
          Ich schon wieder, was meinst Du mit "CGI" benutzen? Das hier: http://aktuell.de.selfhtml.org/artikel/cgiperl/file-upload/
          oder im Perl- Dateiheader das hier:

          #!/usr/bin/perl  
          use CGI qw(:standard);  
          use CGI::Carp qw(fatalsToBrowser);  
          
          ~~~?  
            
          Danke  
          snr
          
          1. Hi,

            Hi,

            bitte zitiere nur das, worauf Du Dich beziehst, danke.

            @Cheatah:

            Das brauchst Du nicht zu erwähnen, da es bereits durch den Umstand klar wird, dass Du auf einen von mir verfassten Artikel antwortest. Wenn Du jemand anderen als mich hättest ansprechen wollen, wäre dessen Erwähnung sinnvoll.

            Sag ich ja. Benutze das Modul "CGI".
            was meinst Du mit "CGI" benutzen?

            "CGI benutzen" heißt auf Englisch "use CGI". Exakt dies findest Du sowohl auf der von Dir genannten Seite, als auch im von Dir genannten Code-Schnipsel. Wenn Du nicht weißt, wie damit umzugehen ist, gibt es zunächst einmal nur eins:

            Konsultiere die entsprechende Seite der Dokumentation.

            Sollten wider Erwarten anschließend noch Fragen offen sein, wirst Du hier auf bereitwillige Helfer stoßen.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. [...] von mir verfassten Artikel [...]

              Aufschneider ;)

              Siechfred

              --
              Obacht, hinter jedem noch so kurzen Posting könnte ein Essayist sitzen!
      2. Hier mal einen kurzen Ausschnitt aus den ersten "Auseinanderfummlen" der Daten:

        Das ist das Problem: Du versuchst, eine Kokosnuss mit einer Nagelfeile zu knacken. Du gehst davon aus, dass der Body des POST-Requests bei "gemischten" Formularen nach dem selben Schema aufgebaut ist wie ein Querystring bei GET-Requests. Das ist aber falsch, wie Du bei einem Blick in RFC 1867, sec. 6 feststellen wirst. Spätestens an diesem Punkt solltest Du Dir wirklich gut überlegen, ob Du Dir das Parsen von Hand wirklich antun möchtest... ;)

        Siechfred

        --
        Obacht, hinter jedem noch so kleinen Busch könnte ein Indianer sitzen!
  2. Was schon geht:
    Ich kann den Text übertragen, auswerten, und abspeichern, sowie auslesen und auf einer neuen Seite anzeigen. Ich kann auch die Bilder hochladen, aber beides zusammen geht natürlich nicht.
    Was nicht geht:
    Wenn ich in das <FORM>- Tag den "enctype=multipart/form-data" setze, dann kann ich die Texteingaben nicht mehr decodieren, da ja das ganze im Uploadmodus übertragen wird. Ich bekomme dann nur in der ersten Variablen alle Form- Daten (nicht dekodiert) und danach die Bilddaten.

    Ein Hinweis.
    Browser neigen immer mehr dazu, dass das <input type=file> Element nur noch über die File-Auswahl zu steuern ist, und ein Löschen der Eingabe weder manuell noch via JS möglich ist. In diesem Falle würde ein reset Button notwendig sein, der aber alle Formulardaten löscht, was für einen Poster in einem früheren Thread ein Ärgernis darstellte.

    Aus diesem Gedankengang komme ich zum Ergebnis, dass man fileupload und weitere Daten zu diesem File tunlichst trennen sollte, das heisst, die Akzeptanz des Files von der Validität der in einem späteren submit gestellten Daten abhängig machen sollte (oder umgekehrte Submit Folge).

    Nimmt wich Wunder, was andere dazu meinen.

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>        ><o(((°>
       <°)))o><                      ><o(((°>o
  3. Man könnte das natürlichmit fertiger Software realisieren,aber ich möchte es lernen und unssre kleine Gebrauchtmaschinenbörse selbst programmieren.
    Also bitte keine diesbezüglichen Hinweise, es gibt sowas sicher schon...

    Wenn du mit Perl eine Anwendung programmieren möchtest solltest du bzw. musst du dich mit den Modulen beim CPAN auseinandersetzen. Da du erst bei den Grundlagen bist, scheint es für dich vielleicht übertrieben zu sein für so eine "einfache" Sache ein 200KB grosses Modul einzubinden, aber schon bei deiner konkreten Frage wirst du es schwierig haben und lange brauchen bis das funktioniert was du da vor hast. Module sind keine fertige Software sondern Komponenten von Perl. Kurz gesagt use CGI;!

    Und noch wichtiger!!!
    Benutzte use strict und lass dir die Warnungen ausgeben, z.b. mit dem Schalter -w, ansonsten wirst du mit deinem Skript nie fertig (es sei den du bist der geniale Programmierer)

    Struppi.