holgersen: Datei upload

Hallo Miteinander, liebe cgi-Perl usw. Spezialisten,

hier gibt es ein Problem mit file upload. Konkret: Ich versuche, über ein cgi-Script eine Datei auf den Server zu laden. Prinzipiell ist bekannt, wie das
geht, wenn man einen extra upload Button hat und mit input type="file" arbeitet:

<form action="./cgi-bin/upload.cgi" method="post" enctype="multipart/form-data">
<INPUT TYPE="file" NAME="uploaded_file" SIZE=30 MAXLENGTH=80>

Was ich machen will, geht ein bisschen anders. Ich habe eine Form (html-file), in die ich verschiedene Sachen eintrage, unter anderem auch über einen
Dateiselektor ein Bild

<INPUT TYPE="file" NAME="uploaded_file" SIZE=30 MAXLENGTH=80>

Das heißt, mein cgi-Script, kennt einen Parameter, der param("uploaded_file") heißt. Ich möchte jetzt, dass das entsprechende file hochgeladen wird, wenn
ich das gesamte Formular mittels "submit" abschicke:

<input type="submit" value="Formular abschicken">

Das heißt, hinter dem action button versteckt sich kein "file", sondern ein "submit". Ich möchte das so machen, weil ich nicht erst einen Knopf drücken
möchte für "Bild (File) hochladen" und dann mit "submit" meine anderen Daten verarbeiten, sondern mit einem Knopfdruck ("submit") sowohl die Daten
verarbeiten als auch das Bild (File) auf den Server bringen möchte. Ist so etwas möglich/wie? In der Hoffnung, Ihr habt mich verstanden und auf Hilfe, schon
mal Herzlichen Dank!,

holgersen

  1. Hi,

    Das heißt, hinter dem action button versteckt sich kein "file", sondern ein "submit". Ich möchte das so machen, weil ich nicht erst einen Knopf drücken
    möchte für "Bild (File) hochladen" und dann mit "submit" meine anderen Daten verarbeiten, sondern mit einem Knopfdruck ("submit") sowohl die Daten
    verarbeiten als auch das Bild (File) auf den Server bringen möchte. Ist so etwas möglich/wie?

    ähm, Du beschreibst den trivialen Fall. Ein Button à la "Datei hochladen", nach dem man das Formular weiter verwenden kann, ist ein umständlicher Prozess, bei dem man ziemlich viele Dinge beachten muss - und der mit exakt dem beginnt, was Du vorhast.

    Sprich: Du hast Dir gerade selbst ein Problem im Geiste produziert, wo überhaupt keines ist.

    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 Cheatah,

      ich muss sagen, ich kann nicht ganz folgen :-). Mein Problem ist: Ich
      verarbeite mit dem cgi-Script einen Button, hinter dem sich "submit"
      versteckt. Aus dem html-Formular sind mir im cgi-Script auch Pfad und Name der Datei, die hochgeladen werden soll, bekannt (param("uploaded_file")). Die Frage ist nun, wie ich das Hochladen, eben ausgehend von param("uploaded_file") in dem Script machen kann. Die Standardmethode mit <INPUT TYPE="file" NAME="uploaded_file"...> möchte ich nicht machen, weil ich dann ja wohl erst den Button für "File hochladen" drücken würde und dann über einen weiteren Button ("submit") die anderen Formulardaten verarbeiten würde. Ich möchte Beides durch einen einzigen Button erledigen. Soweit klar? Oder habe ich einen Denkfehler? Vielen Dank nochmal,

      holgersen

      1. ich muss sagen, ich kann nicht ganz folgen :-).

        Es ist auch nicht einfach deinen Schilderungen zu folgen.

        Mein Problem ist: Ich
        verarbeite mit dem cgi-Script einen Button, hinter dem sich "submit"
        versteckt.

        Was heißt versteckt? Ich nehme an man kann den Button in dem Dokument anklicken und dann schickst du den Inhalt des Formulars an das Skript.

        Aus dem html-Formular sind mir im cgi-Script auch Pfad und Name der Datei, die hochgeladen werden soll, bekannt (param("uploaded_file")). Die Frage ist nun, wie ich das Hochladen, eben ausgehend von param("uploaded_file") in dem Script machen kann.

        Besser ist es die Funktion upload() zu verwenden, lies dir mal die Doku dazu durch.

        Die Standardmethode mit <INPUT TYPE="file" NAME="uploaded_file"...> möchte ich nicht machen, weil ich dann ja wohl erst den Button für "File hochladen" drücken würde und dann über einen weiteren Button ("submit") die anderen Formulardaten verarbeiten würde. Ich möchte Beides durch einen einzigen Button erledigen. Soweit klar? Oder habe ich einen Denkfehler?

        Ja, der Denkfehler ist, das das nicht geht. Einen Datei upload kannst du nur mit einem solch einen Formularfeld machen. Es geht nicht anders.

        Struppi.

      2. Hi,

        Die Frage ist nun, wie ich das Hochladen, eben ausgehend von param("uploaded_file") in dem Script machen kann.

        das Hochladen der Datei war bereits komplett abgeschlossen gewesen gehabt haben[1], wenn Du in param("uploaded_file") irgendwas drin stehen hast. Dein Server *empfängt* die Daten.

        Die Standardmethode mit <INPUT TYPE="file" NAME="uploaded_file"...> möchte ich nicht machen, weil ich dann ja wohl erst den Button für "File hochladen" drücken würde

        Nei-en. Ein <input type="file"> bewirkt, dass - sofern der enctype des Formulars richtig gesetzt ist - beim Absenden des Formulars die Datei hochgeladen wird. Ganz egal, ob der verwendete Button mit "File hochladen" beschriftet ist oder nicht.

        und dann über einen weiteren Button ("submit") die anderen Formulardaten verarbeiten würde. Ich möchte Beides durch einen einzigen Button erledigen. Soweit klar? Oder habe ich einen Denkfehler?

        Eher einen Lesefehler. Genau hierum drehte sich mein vorheriges Posting. Das Verfahren mit dem weiteren Button erfordert (z.T. nicht unerhebliche) zusätzliche Aufwände, während das, was Du vorhast, der *triviale* Fall ist, der bei dem längeren Verfahren *ein Teil* ist.

        Cheatah

        [1] Die Sache ist dermaßen vergangen, dass ich einfach noch ein paar Vergangenheitsformen in den Satz einbringen musste.

        --
        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
      3. Hallo,

        ich muss sagen, ich kann nicht ganz folgen :-). Mein Problem ist: Ich

        ich muss sagen, ich kann Dir nicht ganz folgen. Im Ausgangsposting schreibst Du ganz anderes.

        Die Standardmethode mit <INPUT TYPE="file" NAME="uploaded_file"...> möchte ich nicht machen,

        Die Standardmethode mit <input type="file" name="uploaded_file"...> musst Du nutzen, weil Du sonst keine Datei hochladen kannst.

        In Deinem Ausgangsbeitrag schreibst Du übrigens, dass Du dies nutzen willst.

        weil ich dann ja wohl erst den Button für "File hochladen" drücken würde und dann über einen weiteren Button ("submit") die anderen Formulardaten verarbeiten würde. Ich möchte Beides durch einen einzigen Button erledigen.

        Dann bleibt Dir nur Javascript übrig. Nimm ein Dir genehmes Ereignis, das _nach_ Auswahl der Datei erfolgt und lasse Javascript die submit-Methode des Formularobjektes ausführen.

        Ich halte das *nicht* für eine gute Idee. Es wird unnötigerweise Javascript benötigt und der arme Benutzer darf auch keine Fehler machen, da er keine Chance hat, seine Auswahl zu korrigieren. Dies erscheint mir sehr benutzerunfreundlich.

        Was hat clientseitige Verarbeitung mit serverseitigem Perl zu tun?

        Freundliche Grüße

        Vinzenz

  2. Hallöchen von hier,

    ich krieg die Krise oder komme aus einem anderen Kulturkreis. Auf alle Fälle hoffe ich, dass Ihr mich nicht fertig machen wollt.... Ich Euch
    übrigens nicht, ich bin wirklich so dämlich....

    Lasst es mich nochmal ganz systematisch versuchen:

    1.) Wenn ich es im html-File so mache:

    <form action="./cgi-bin/upload.cgi" method="post" enctype="multipart/form-data">
    <INPUT TYPE="file" NAME="uploaded_file" SIZE=30 MAXLENGTH=80>

    kann ich in dem entsprechenden cgi-File upload.cgi das Hochladen der entsprechenden Datei bewerkstelligen. Soweit, so gut. Verstanden soweit?

    2.) Da mein html-File ein Formular ist, in das ich noch einige andere Sachen eintrage und ich diese Sachen durch

    <form action="./cgi-bin/feedback.cgi" method="post" enctype="multipart/form-data">
    <input type="submit" value="Formular abschicken">

    im File feedback.cgi verarbeite, würde ich gerne in diesem File feedback.cgi, in dem mir durch das

    <INPUT TYPE="file" NAME="uploaded_file" SIZE=30 MAXLENGTH=80>

    aus dem html-File der Parameter param("uploaded_file") bekannt ist, auch das Hochladen der Datei bewerkstelligen.

    Auch verstanden?

    Das will ich im Wesentlichen deswegen machen, weil ich mit einem Knopfdruck sowohl die anderen Daten im Formular (html-File) verarbeiten als auch das Bild hochladen möchte.

    Soweit auch klar?

    Oder ganz anders gesagt, falls das immer noch unverständlich sein sollte:

    Wie kann ich aus einem html-Formular, in das ich den Namen eines Bildes, das z.B. lokal bei mir auf der Platte liegt, und weitere Daten eintrage, mit einem einzigen Knopfdruck Beides machen, Daten verarbeiten und Bild auf den Server laden?

    Wenn ich Cheatah bzw. Vinzenz Mai richtig verstanden habe, ist das wohl nicht möglich? Wäre super schade, eigentlich dachte ich, dass dadurch, dass ich im feedback.cgi die Variable param("uploaded_file") kenne, die Aufgabe lösbar ist. Wie immer herzlichen Dank für Eure Hilfe, aus der ich bald eine Information zu entnehmen gedenke,

    holgersen

    1. aus dem html-File der Parameter param("uploaded_file") bekannt ist, auch das Hochladen der Datei bewerkstelligen.

      wie schon gesagt, besser ist upload(), steht auch in der Doku, les sie doch Bitte!

      Wenn ich Cheatah bzw. Vinzenz Mai richtig verstanden habe, ist das wohl nicht möglich? Wäre super schade, eigentlich dachte ich, dass dadurch, dass ich im feedback.cgi die Variable param("uploaded_file") kenne, die Aufgabe lösbar ist. Wie immer herzlichen Dank für Eure Hilfe, aus der ich bald eine Information zu entnehmen gedenke,

      Ich weiß nicht wo das Problem ist, du musst um eine Datei hochzuladen ein File Formularfeld benutzen und dort kann der User eine lokale Datei eintragen, diese wird hochgeladen und kann auf dem Server mit der von mir gennnten Methoden verabreitet werden.

      Struppi.

      1. aus dem html-File der Parameter param("uploaded_file") bekannt ist, auch das Hochladen der Datei bewerkstelligen.

        wie schon gesagt, besser ist upload(), steht auch in der Doku, les sie doch Bitte!

        Hallo Struppi,

        die Anleitung ist für Netscape.

        Wenn ich Cheatah bzw. Vinzenz Mai richtig verstanden habe, ist das wohl nicht möglich? Wäre super schade, eigentlich dachte ich, dass dadurch, dass ich im feedback.cgi die Variable param("uploaded_file") kenne, die Aufgabe lösbar ist. Wie immer herzlichen Dank für Eure Hilfe, aus der ich bald eine Information zu entnehmen gedenke,

        Ich weiß nicht wo das Problem ist, du musst um eine Datei hochzuladen ein File Formularfeld benutzen und dort kann der User eine lokale Datei eintragen, diese wird hochgeladen und kann auf dem Server mit der von mir

        gennnten Methoden verabreitet werden.

        Ja, richtig, aber dann muss ich einmal einen Button drücken, um das File hochzuladen und danach einen Button, um die restlichen Eingabedaten des Formulars weiterzuverarbeiten und genau das wollte ich vermeiden.

        Struppi.

        1. Holla

          Ja, richtig, aber dann muss ich einmal einen Button drücken, um das File hochzuladen und danach einen Button, um die restlichen Eingabedaten des Formulars weiterzuverarbeiten und genau das wollte ich vermeiden.

          Kleine Korrektur:
          Der von Dir erstgenannte Button sorgt erstmal nur für die Dateiauswahl. Das Abenden des Formulars dann erst für den eigentlichen Upload, bzw. die Serverseitige Verarbeitung des Forms.

          Zum Thema an sich:
          Stell Dir mal die sicherheitsrelevanten Konsequenzen vor, wenn dies so möglich wäre...
          Dann könnte man in beliebige Formulare per Zufallsprinzip Pfadangaben zum Upload einbauen(z.B. c:\passworte.txt) und so an hüsche Sachen herankommen, ohne dass der User etwas hiervon merkt.
          Also: freu Dich, dass es ist, wie es ist und lebe damit ;-)

          Grüße

    2. Yerf!

      Irgendwo ist da noch ein Knoten drinn...

      1.) Wenn ich es im html-File so mache:

      <form action="./cgi-bin/upload.cgi" method="post" enctype="multipart/form-data">
      <INPUT TYPE="file" NAME="uploaded_file" SIZE=30 MAXLENGTH=80>

      kann ich in dem entsprechenden cgi-File upload.cgi das Hochladen der entsprechenden Datei bewerkstelligen. Soweit, so gut. Verstanden soweit?

      Nein. Denn du benötigts noch einen Submit-Button oder etwas JavaScript-Code, damit das Formular abgesendet wird. Und erst dann wird die Datei hochgeladen.

      Und von daher sieht hier irgendwie keiner den Unterschied (und damit das Problem) zu dem hier:

      2.) Da mein html-File ein Formular ist, in das ich noch einige andere Sachen eintrage und ich diese Sachen durch

      <form action="./cgi-bin/feedback.cgi" method="post" enctype="multipart/form-data">
      <input type="submit" value="Formular abschicken">

      [...]

      <INPUT TYPE="file" NAME="uploaded_file" SIZE=30 MAXLENGTH=80>

      Mach einfach ein Formular. Füg dort den Input Type=File sowie deine weiteren Inputfelder ein. Gib dem ganzen ein Submit-Button und werte im angesprochenen Script alles aus. Dir werden dort das File sowie alle weiteren daten zur Verfügung stehen.

      Gruß,

      Harlequin

      --
      <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->