Daniel_T: Bild hochladen

Hallo!

Ich hab folgenden Code zum hochladen von Bildern gefunden:

while (0 != read($file,$buffer,2048))
{
$file_buffer = "$file_buffer" . "$buffer";
print "read<br>";
}

Wenn ich $file="C:\test.jpg" setze, sollte das nicht funktionieren?
Was mach ich falsch? :(

Danke!
Daniel

  1. Wenn ich $file="C:\test.jpg" setze, sollte das nicht funktionieren?
    Was mach ich falsch? :(

    Du kannst nicht willkürlich etwas hier eintragen. In $file muss der Filehandle aus dem upload Feld des Formulares stehen (bzw. den das Modul CGI generiert). Ohne das Module wirst du nicht weiterkommen und die Doku dazu liefert schon ein einfaches funktionerendes Beispiel.

    Struppi.

    1. Du kannst nicht willkürlich etwas hier eintragen. In $file muss der Filehandle aus dem upload Feld des Formulares stehen (bzw. den das Modul CGI generiert). Ohne das Module wirst du nicht weiterkommen und die Doku dazu liefert schon ein einfaches funktionerendes Beispiel.

      Wie sollt den der Filehandle aussehen? Normaler String oder was anderes?

      Weil eigentlich hab ich ja ein vorgefertigtes Skript, dass auch schon funktioniert hat. Ich wollt das in meine Anwendung übernehmen.

      So werden die In-Parameter gelesen:
      my $incgi = new CGI;
      my @params=$incgi->param();
      my $param;
      my %in;
      foreach $param (@params)
      {
        $in{$param}=$incgi->param($param);
      }

      return %in;

      und ich mach dann eigentlich:

      while (0 != read($in{fullname},$buffer,2048))
      {
      $file_buffer = "$file_buffer" . "$buffer";
      print "read-";
      }

      Das input mach ich so:
      <form action="upload.cgi" method="post" ENCTYPE="multipart/form-data" name="upload">
      <input type=file name="fullname" >
      <input type="submit" value="Bild hochladen">
      </form>

      was passt da nicht?

      Struppi.

      Daniel

      1. Du kannst nicht willkürlich etwas hier eintragen. In $file muss der Filehandle aus dem upload Feld des Formulares stehen (bzw. den das Modul CGI generiert). Ohne das Module wirst du nicht weiterkommen und die Doku dazu liefert schon ein einfaches funktionerendes Beispiel.

        Wie sollt den der Filehandle aussehen? Normaler String oder was anderes?

        my $file = CGI::param('uploadfeld');

        Weil eigentlich hab ich ja ein vorgefertigtes Skript, dass auch schon funktioniert hat. Ich wollt das in meine Anwendung übernehmen.

        So werden die In-Parameter gelesen:
        my $incgi = new CGI;
        my @params=$incgi->param();
        my $param;
        my %in;
        foreach $param (@params)
        {
          $in{$param}=$incgi->param($param);
        }

        return %in;

        Das ist überflüssig.

        und ich mach dann eigentlich:

        while (0 != read($in{fullname},$buffer,2048))

        $in{fullname} ist in dem Falle nur ncoh ein String.

        was passt da nicht?

        Das du nicht die CGI Funktion verwendest.

        Struppi.

        1. Hallo Struppi,

          Wie sollt den der Filehandle aussehen? Normaler String oder was anderes?

          my $file = CGI::param('uploadfeld');

          Hier sollte man besser die Methode upload() verwenden, die von neueren Versionen des CGI-Modules bereitgestellt wird. Diese erzeugt im Gegensatz zu param() ein gültiges Datei-Handle und kann auch dazu benutzt werden, um zu testen, ob der Upload erfolgreich war.

          Viele Grüße
            Patrick Canterino

          --
          "Die Tabakindustrie schafft laufend Arbeitsplätze: Jährlich werden über 5.000 Arbeitsplätze der Rauchertoten frei." (Gerhard Kocher)
          1. Hallo ,

            Hier sollte man besser die Methode upload() verwenden, die von neueren Versionen des CGI-Modules bereitgestellt wird. Diese erzeugt im Gegensatz zu param() ein gültiges Datei-Handle und kann auch dazu benutzt werden, um zu testen, ob der Upload erfolgreich war.

            z.B. so:

            my $q = new CGI;

            use File::Basename;

            Mit File::Basename kann aus der lokalen Datei und dem lokalen Pfad

            der Dateiname ermittelt werden, so dass der Benutzer diesen

            beim Upload nicht extra eingeben muss

            use strict;

            Weitere globale Varaiblen definieren

            my($bytesread,$sum,$buffer) = undef;

            den HTTP Header zum Browser senden, using CGI Object:

            print $q->header;

            Die folgende Kontrollstruktur bestimmt den Ablauf des CGI Scripts

            if($q->param){
            upload();
            }
            else
            {
            form();
            }

            exit;

            Viele Grüße
            Alain

          2. Hier sollte man besser die Methode upload() verwenden, die von neueren Versionen des CGI-Modules bereitgestellt wird. Diese erzeugt im Gegensatz zu param() ein gültiges Datei-Handle und kann auch dazu benutzt werden, um zu testen, ob der Upload erfolgreich war.

            Stimmt ein Stück weiter unten:
            To be safe, use the upload() function (new in version 2.47). When called with the name of an upload field, upload() returns a filehandle, or undef if the parameter is not a valid filehandle.

            $fh = $query->upload('uploaded_file');
                 while (<$fh>) {
                       print;
                 }

            War mir noch gar nicht aufgefallen.

            Struppi.

        2. my $file = CGI::param('uploadfeld');

          Ich hab damit jetzt den File-Handle geholt, bevor ich meine Standard GetParam Routinge ausführ, damit klappts.

          Das ist überflüssig.

          Für das jetzt ja, aber so bekomm ich immer alle mitgegebenen Parameter rein!

          Das du nicht die CGI Funktion verwendest.

          Jetzt schon!

          Danke!!!

          Struppi.

          Daniel

          1. Das ist überflüssig.
            Für das jetzt ja, aber so bekomm ich immer alle mitgegebenen Parameter rein!

            Die bekommst du doch auch so - wo ist der Vorteil alle Parameter doppelt im speichern zu halten?

            Struppi.

            1. Die bekommst du doch auch so - wo ist der Vorteil alle Parameter doppelt im speichern zu halten?

              Doofe Frage... aber gibts das auch in einer Kurzform:
              my $file = CGI::param('uploadfeld');

              Jetzt hab ichs ja immer so, dass ich einfach $in{NAME} für die Parameter schreiben muss... immer das CGI::... ist ja doch mühsam!

              Gibts da was kurzes?

              Struppi.

              Danke!
              Daniel

              1. Die bekommst du doch auch so - wo ist der Vorteil alle Parameter doppelt im speichern zu halten?

                Doofe Frage... aber gibts das auch in einer Kurzform:
                my $file = CGI::param('uploadfeld');

                nö.

                Jetzt hab ichs ja immer so, dass ich einfach $in{NAME} für die Parameter schreiben muss... immer das CGI::... ist ja doch mühsam!

                Wieso wie oft schreibst du das denn?

                Du brauchst das doch lediglich an einer Stelle wo du den upload durchführst und dort kannst du auch eine Variabel verwenden.

                my $fh = CGI::upload('uploadfeld');
                my $o_file = 'output';
                open O, ">$o_file" or die "$!";
                binmode O;
                while (my $bytesread = read($fh,$buffer,1024))
                {
                print O $buffer;
                }
                close O;

                Dann hast du es einmal gebraucht und fertig.

                Gibts da was kurzes?

                kurz ist nicht immer besser. durch das CGI:: weißt du sofort, auch nach Jahren, aus welchem Modul die Funktion stammt.

                Struppi.

                1. Wieso wie oft schreibst du das denn?

                  In dem Fall eh nur 1 mal, aber ich hab einige größere Anwendungen, und da geh ich mit den Parametern immer so vor. Sind ja doch bei einigen Formularen 30 oder mehr Felder...

                  Dann hast du es einmal gebraucht und fertig.

                  Das war ja allgemein gefragt... in dem Fall genügt das so!

                  kurz ist nicht immer besser. durch das CGI:: weißt du sofort, auch nach Jahren, aus welchem Modul die Funktion stammt.

                  Wenn ich bei allen Programm %in verwende, und am Dateianfang %in = Modul() mach, dann hat das denk ich den selben Effekt!

                  Struppi.

                  Daniel

                  1. kurz ist nicht immer besser. durch das CGI:: weißt du sofort, auch nach Jahren, aus welchem Modul die Funktion stammt.

                    Wenn ich bei allen Programm %in verwende, und am Dateianfang %in = Modul() mach, dann hat das denk ich den selben Effekt!

                    %in und CGI:: finde ich zumindest deutlich unterscheidbar, %in kann alles mögliche, während CGI:: sehr eindeutig ist. Ich rede von den Zuweisungen im Programmablauf. zumal du das bisschen Ersparung bei der Tipparbeit mit einer 100% Kopie aller CGI Variabeln erkaufst.

                    Außerdem, wenn du wirklich überall auf %in drauf zugreifen willst, dann arbeitest du offensichtlich mit einer globalen Variabel,  was auch nicht sonderlich schön ist und zu unangenehmen Effekten führen kann.

                    Struppi.

                    1. %in und CGI:: finde ich zumindest deutlich unterscheidbar, %in kann alles mögliche, während CGI:: sehr eindeutig ist. Ich rede von den Zuweisungen im Programmablauf. zumal du das bisschen Ersparung bei der Tipparbeit mit einer 100% Kopie aller CGI Variabeln erkaufst.

                      Da ich ja nie was anderes in $in reinschreibe, und es in allen Programmen nur für die Parameter genutzt wird, ist es auch deutlich, find dich.

                      Das alles zu 100% dann eigentlich nur ne Kopie ist, an das hab ich bisher eigentlich nicht gedacht.

                      Außerdem, wenn du wirklich überall auf %in drauf zugreifen willst, dann arbeitest du offensichtlich mit einer globalen Variabel,  was auch nicht sonderlich schön ist und zu unangenehmen Effekten führen kann.

                      Mit überall mein ich, in einem Programm. In Module wird der Hash mitgegeben.
                      --------
                      Da wo ich arbeite, hab ich die Programme eines ausscheinenden Mitarbeiters übernommen. %in und die anderen Module waren teilweise schon komplett vorgestrickt und ich habe die einfach übernommen.

                      War vielleicht nicht ganz so gut, aber du hast mir jetzt zumindest mal einige Denkanstöße gegeben!

                      Struppi.

                      Danke
                      Daniel