willy96: CGI/Perl Upload Script

Guten Tag allerseits

Ich bin jetzt schon seit mehreren Stunden am suchen und komme auf keinen grünen Zweig.

Mein Wunsch:
Upload CGI Script integriert in HEADER.html vom Apache
Sprich die Forms integriert mit zugriff auf das Script.

Mein Problem:
Ich bekomme bei kleineren Scripten wie z.B. Zählen der User keine Probleme nur bei Scripts wie dem besagten Upload Script bekomme ich eine internal server error 500 Fehlermeldung.

Es sei gesagt dass ich mich mit Scripten nicht sehr gut auskenne und nur die Grundlagen erkenne wenn ich es vor mir habe, aber nicht selber schreiben könnte und die Upload Scripts meist per copy paste erstanden habe, wobei sich natürlich Fehler einschleichen könnten.

Ich bin für jede Hilfe dankbar :)

  1. Hi,

    Mein Wunsch:
    Upload CGI Script integriert in HEADER.html vom Apache
    Sprich die Forms integriert mit zugriff auf das Script.

    Keine Ahnung, was du damit meinst.

    Mein Problem:
    Ich bekomme bei kleineren Scripten wie z.B. Zählen der User keine Probleme nur bei Scripts wie dem besagten Upload Script bekomme ich eine internal server error 500 Fehlermeldung.

    Dann schau als erstes ins Error-Log des Webservers.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Guten Morgen

      Im error Log steh leider nix brauchbares:
      -----[Thu Aug 04 07:12:20 2011] [notice] caught SIGTERM, shutting down
      [Thu Aug 04 07:12:21 2011] [notice] Apache/2.2.17 (Ubuntu) PHP/5.3.5-1ubuntu7.2 with Suhosin-Patch mod_ssl/2.2.17 OpenSSL/0.9.8o mod_perl/2.0.4 Perl/v5.10.1 configured -- resuming normal operations-----

      was ich mit CGI upload meinte war: ich möchte gerne ein Upload button in meine HEADER.html im Apache einbinden dass jeder in der Lage ist sache hochzuladen. Das wollte ich mithilfe von CGI Scripten realisieren weil mir das sinnvoll erschien. Nur leider kriege ich das ganze nicht zum laufen sobald es um Uploading geht ...

      Danke schonmal für jede Hilfe :)

      1. hi Willy,

        Danke schonmal für jede Hilfe :)

        Du wirst Einiges selbst dazutun müssen. Ein kleines Script wird Dir vielleicht helfen, bitte schau Dir die Erläuterungen an, da steht alles, was Du zum Upload brauchst. Upload ist keine Hexerei, das Perl-Modul CGI.pm liefert Dir ein Dateihandle, Du kannst entweder gleich das Handle auslesen oder den Dateinamen ermitteln und die Datei kopieren wo Du wolle.

        Hotti

        1. Guten Morgen

          Danke schonmal für die Hilfe werde mich da heute mal reinlesen.

          gruß Willy96

          1. Super

            Das hat schonmal astrein funktioniert.
            Allerdings würde ich die Datei zusätzlich noch gerne auf dem Server speichern und nicht nur deren Inhalt angezeigt bekommen.
            Gibt es dafür auch eine solch Praktische Lösung :)

            Vielen Dank trozdem schonmal das hat mir echt weitergeholfen :)

            Gruß Willy96

            1. Moin,

              Das hat schonmal astrein funktioniert.

              Cool ;)

              Allerdings würde ich die Datei zusätzlich noch gerne auf dem Server speichern und nicht nur deren Inhalt angezeigt bekommen.
              Gibt es dafür auch eine solch Praktische Lösung :)

              Es gibt Zwei:

              1. File::Copy einbinden und die Temp-Datei einfach kopieren
                
              $c = CGI->new;  
              $fh = $c->param('filefield'); # Handler  
              $c->tmpFileName($fh);          # Dateiname aus Handle ermitteln  
              
              
              1. Das Handle mit read() auslesen
                
              # Length ermitteln  
              $len = -s $fh;  
              seek $fh, 0,0; # zum Amfang  
              read($fh, $filecontent, $len);  
              
              

              Hotti

              1. Danke

                Werds ma probieren einzubauen :)

                Gruß Willy96

                1. hi,

                  Werds ma probieren einzubauen :)

                  Danke auch ;)

                  Btw., das Formular kannst du auch selbst erzeugen und mit print() ausgeben, die CGI-Methoden sind nicht jedermanns Geschmack.

                  Hotti

                  1. So
                    zurück vom Frühstück und rauf auf den Schlauch.
                    Steht sich gut da...
                    ich bekomm das irgendwie nicht eingebaut bzw. selber geschrieben abrufen tu ich das ganze mit nem Formular:

                    <form action="http://meineadressezumscript.de" method="post" enctype="multipart/form-data">
                    <input type="file" name="upfile" accept="text/*" maxlength="40000000">
                    <input type="submit">
                    <input type="reset">
                    </form>

                    Dies ruft dann das Script unter http://rolfrost.de/map/article/cgi/upload  auf.

                    nur für das speichern auf den Server bin ich irgendwie zu neu in der Scriptwelt :(

                    Dankeschön für Hilfe ;)

                    Gruß Willy96

                    1. hi,

                      Dies ruft dann das Script unter http://rolfrost.de/map/article/cgi/upload  auf.

                      Ja, das ist ein Script. Wenn es mit GET- oder POST-Paramtetern aufgerufen wird, kommt eine Antwortseite auf der steht, dass Parameter nicht erlaubt sind.

                      nur für das speichern auf den Server bin ich irgendwie zu neu in der Scriptwelt :(

                      Es muss alles auf Deinem Server ablaufen und das action-Attribut im Formular muss auf ein Script auf Deinem Server zeigen:

                      action="/cgi-bin/upload.cgi"

                      Natürlich kann upload.cgi das Form auch selbst erzeugen, wichtig sind die weiteren Attribute method="POST " und enctype="multipart/form-data" (hast Du schon).

                      upload.cgi muss ausführbar sein und muss nach dem Upload eine Antwortseite ausgeben. All dies kann von einem einzigen CGI-Script gemacht werden, Du brauchst dazu nur eine entsprechende Parameter-Kontrollstruktur.

                      Horst

                      1. Hallo und Guten morgen
                        Ich hoffe alle haben das Wocheneden genossen :)

                        Also zurück zum Thema.
                        Das mit dem Anzeigen der hochgeladenen Datei hatte ich schon hinbekommen mein Problem war, dass ich die Datei nicht auf den Server gespeichert bekommen hab. Sprich wenn ich das Fenster mit den Infos über die Datei wieder geschlossen hatte war nirgends auf dem Server solch eine zu finden.

                        Dankeschön für eure Hilfe

                        1. Also nochmal neu zum Verstehen meines Problems :)

                          Ich habe ein Perl Script welches zum Upload von Dateien zuständig ist. Allerdings speichert dieses die Dateien ausschließlich in den temporären Ordner.

                          Script: http://rolfrost.de/map/article/cgi/upload

                          ich möchte es nun folgendermaßen anpassen, so, dass das Script die Dateien nicht nur in den Temporären sondern in einen von mir frei wählbaren Ordner bzw. einen anderen festgelegten Ordner legt.

                          Da ich aber nicht viel vom Scripten verstehe sondern nur den groben Kontext erkenne würde ich um Scriptanpassungen bitten...

                          Vielen Dank schonmal

                          1. Hat denn keiner die Motivation mir hier noch ein wenig zu helfen ?

                            1. Wollte das ganze jetzt so (mit system copy anweisung) machen allerdings gibt er mir zwar aus dass die Datei so und so heisst etc aber kopiert sie nicht in das erwünschte Verzeichnis.

                              GNU nano 2.2.6                     Datei: upload.pl

                              #!/usr/bin/perl

                              use strict;
                              use CGI qw(-private_tempfiles);
                              use File::Copy;
                              $CGI::POST_MAX = 40_000_000;

                              my $c = CGI->new;
                              my $old = '/var/tmp/$c';
                              my $new = '/Fileserver/Frederik/$c';

                              if($c->param){
                                      print $c->header(-charset => 'utf-8'), $c->h2('Result');
                                      my $fh = $c->param('upfile'); # Get the FileHandle from temp-File
                                      printf qq(<p>Dateigröße: %s Bytes, Name der Tmp-Datei: %s</p>),
                                              -s $fh, $c->tmpFileName($fh);

                              # Weitere Informationen aus uploadInfo
                                      print "<pre>";
                                      foreach my $k(keys %{$c->uploadInfo($fh)}){
                                              printf "%-25s => %s\n", $k, $c->uploadInfo($fh)->{$k};
                                      }
                                      print "</pre>";
                                      system("cp $old $new");
                                      close $fh;
                              }
                              else{ # Erzeuge das Upload-Formular
                                      print $c->header(-charset => 'utf-8'),
                                              $c->h2('send a file'),
                                              $c->start_form( -enctype => 'multipart/form-data'),
                                              $c->filefield(-name => 'upfile'),
                                              $c->submit(-name => 'upload', -value => 'Datei hochladen'),
                                              $c->end_form;
                              }

                              1. Mag hier wirklich keiner mehr helfen.

                                ich glaube Aufmachen eines neuen Threads ist zwar nicht gerade nobel aber es scheint dass man dennoch so mehr Hilfe bekommt...

                                ziemlich komisch.

                                Bitte dennoch nochmal um Hilfe.

                                1. Bounjoun willy96,

                                  Mag hier wirklich keiner mehr helfen.

                                  Wieso keiner? Frag doch hotti persönlich! Wenn du schon sein Skript einsetzt und er dich im Stich läßt, weil sein Skript gar kein Upload-Skript ist... sondern wieder mal was unfertiges...

                                  Da bist du mit http://perldoc.perl.org/CGI.html schneller weiter, denke ich.

                                  ich glaube Aufmachen eines neuen Threads ist zwar nicht gerade nobel aber es scheint dass man dennoch so mehr Hilfe bekommt...

                                  Das auf keinen Fall. Registrierte User können das Aussehen des Forums so einstellen, dass Threads mit neuen Antworten ganz oben rutschen. Insofern hätte es hotti sehen können, wenn er gewollt hätte.

                                  Hast du denn die Datei, die angeblich hochgeladen wird, in /var/tmp gefunden? Oder war da nichts? Wo nichts ist, kann File::Copy auch nichts kopieren!

                                  Adiou.

                                  --
                                  Ich bin eigentlich ganz anders, aber ich komme so selten dazu. - Ödön von Horwáth
                                  Ist Rudi Carrell Gott? Oder George Harrison Ford?
                                  Ich bin faul und das ist gut so.
                                  1. Guten Morgen

                                    Dankeschön für die Antwort :)

                                    Werde mich mal durchwurschteln und versuchen was sich so machen lässt :)

                                    Danke

                                    1. Hi

                                      Danke nochmal habe es jetzt hiermit hinbekommen:
                                      Also von mir aus als Gelöst markieren ;)

                                      #!/usr/bin/perl

                                      use strict;
                                      use warnings;
                                      use CGI qw(-utf8);
                                      use File::Copy;
                                      use CGI::Carp qw(fatalsToBrowser);
                                      use File::Basename;
                                      $CGI::POST_MAX = 300_000_000;

                                      my $c = CGI->new;

                                      if($c->param)
                                      {
                                              print $c->header(-charset => 'utf-8'), $c->h2('Result');

                                      my $fh = $c->param('upfile');      # Get the FileHandle from temp-File
                                              my $source = $c->tmpFileName($fh); # get the source filename
                                              my $dest = $fh;                    # scalar context, origin filename from UserAgent
                                              my $ref = [fileparse($dest)];      # Dateiname in [0]
                                              print "Der Upload war Erfolgreich";
                                              copy $source, "/var/www/user/$ref->[0]";
                                              print   $c->h2('Navigation'),
                                                      $c->start_form( -enctype => 'multipart/form-data'),
                                                      $c->button(-name => 'back', -value => 'back', -onclick => 'javascript:history.go(-1)');
                                                      $c->button(-name => 'back2', -value => 'user', -onclick => "location.href = 'http://hierlink'";
                                                      $c->end_form;

                                      }

                                      else{ # Erzeuge das Upload-Formular
                                              print $c->header(-charset => 'utf-8'),
                                                      $c->h2('send a file'),
                                                      $c->start_form( -enctype => 'multipart/form-data'),
                                                      $c->filefield(-name => 'upfile'),
                                                      $c->submit(-name => 'upload', -value => 'Datei hochladen'),
                                                      $c->reset(-name => 'clear', -value => 'Feld löschen'),
                                                      $c->button(-name => 'back', -value => 'Zurück zu user', -onclick => "location.href = 'http://hierlink'";
                                                      $c->end_form;
                                              }

  2. hi,

    Ich bekomme bei kleineren Scripten wie z.B. Zählen der User keine Probleme nur bei Scripts wie dem besagten Upload Script bekomme ich eine internal server error 500 Fehlermeldung.

    Zeig doch mal her das Script.

    Hotti