Wolfgang: fileupload per cgi: was tun, wenn kein file ausgewählt?

Hallo Leute,
folgendes Problem quält mich:
Ich habe einen Fileupload plus Text und Zusatzinfos, die per CGI zu einer Pressemitteilung zusammengefügt werden. Allerdings soll, wenn keine Bilddatei ausgewählt wurde, stattdessen eine ANDERE angezeigt werden. Es sieht bisher so aus:

$upload = "$cgi->param("userfile");"
if ( $upload eq "" ) { my $file = "/andere.gif"; } else { my $file = $cgi->param("userfile"); };

Leider funktioniert es einfach nicht, trotz stundenlangem rumprobieren... Wer kann mir helfen? Danke, Wolfgang

PS: Wie kann ich verhindern, dass im Textfeld html-code eingegeben wird?

  1. $upload = "$cgi->param("userfile");"

    Was soll des sein?
    hast du dir den String mal anzeigen lassen?

    if ( $upload eq "" ) { my $file = "/andere.gif"; } else { my $file = $cgi->param("userfile"); };

    Leider funktioniert es einfach nicht, trotz stundenlangem rumprobieren... Wer kann mir helfen? Danke, Wolfgang

    Ein Blick in die Doku kann nie schaden, http://perldoc.perl.org/CGI.html#CREATING-A-FILE-UPLOAD-FIELD

    PS: Wie kann ich verhindern, dass im Textfeld html-code eingegeben wird?

    gar nicht, das musst du filtern.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. hallo,
      das formular ist ein gewöhnliches Html-form-definiertes. ich kann alle variablen mit cgi->param("NAMEDESEINGABEFELDES"); auslesen. dein tip war super, weil $file nur den namen logo.gif ausgibt. habs also geändert. jetzt so geschrieben, geht aber immer noch nicht:#Upload

      Dateinamen erstellen und die Datei auf dem Server speichern

      if ( defined $cgi->param("userfile") )
      {
      my $file = $cgi->param("userfile");
      my $fname       = "../seiten/presse_files/".time.$file.".htm";
      my $fotoname = "../seiten/presse_files/".time.$file;
      my $fotopfad = "../presse_files/".time.$file;
      open DAT,'>'.$fotoname or die 'Error processing file: ',$!;

      Dateien in den Binaer-Modus schalten

      binmode $file;
      binmode DAT;
      my $data;
      while(read $file,$data,1024) {
        print DAT $data;
      }
      close DAT;
      }

      else

      {
      my $fname  = "../seiten/bilder/logo.gif";
      my $fotoname = "../seiten/bilder/logo.gif";
      my $fotopfad = "../seiten/bilder/logo.gif";
      };

      ABER: Die Fehlermeldung lautet immer, dass die in der wenn dann Abfrage definierten Felder eben nicht definiert sind... Bitte um Hilfe... Merci,Wolfgang

      1. Hey,
        dein Code ist nicht geeignet. Du sollst die Funktionen upload und uploadInfo statt param verwenden. Struppi hat auf den Abschnitt in der Dokumentation verwiesen.

        --
        水-金-地-火-木-土-天-海-冥
        1. Da muss ich widersprechen... denn ohne die if Abfrage ist es mir mit diesem Perl möglich gewesen, eine Datei hochzuladen und nach meinen Wünschen zu benennen...
          dieser teil funktioniert also:

          die datei-daten holen

          my $file = $cgi->param("userfile");

          dateinamen erstellen und die datei auf dem server speichern

          my $fname = 'file_'.$$.'_'.$ENV{REMOTE_ADDR}.'_'.time;
          open DAT,'>'.$fname or die 'Error processing file: ',$!;

          Dateien in den Binaer-Modus schalten

          binmode $file;
          binmode DAT;

          my $data;
          while(read $file,$data,1024) {
            print DAT $data;
          }
          close DAT;

          #Datei umbenennen und Verschieben
          my $newfile;
          $newfile = time.$file;
          rename($fname,$newfile);
          was nicht funktioniert, ist die if-Abfrage zu verwirklichen, denn die Fehlerausgabe sagt mir, die in den if- und else-Fällen angegebenen Variablen sind nicht definiert... Danke für eure Hilfe, Wolfgang

      2. Hi,

        das formular ist ein gewöhnliches Html-form-definiertes.

        Ein gewöhnliches form? Du solltest noch so wie es hier steht enctype="multipart/form-data" in das Form-Tag schreiben. Vielleicht ist ja das dein Fehler.

        mfG,
        steckl

        1. Das ist nicht das Problem... Upload funktioniert...Variablen im If-Fall bleiben undefiniert...Wolfgang

      3. if ( defined $cgi->param("userfile") )

        Damit prüfst du, ob dem Script ein Parameter namens 'userfile' übermittelt wurde. Lässt der Anwender das Eingabefeld leer (weil er keine Datei auswählt), wird diese Abfrage trotzdem immer wahr sein. Willst du hingegen abfragen, ob dem Script tatsächlich ein Dateiname übergeben wurde, so betrachte den String im booleschen Kontext:

        my $datei = $cgi->param('userfile');  
        # wurde dem Script ein Parameter namens userfile übergeben?  
        defined $datei ? print 'Parameter vorhanden' : print 'Kein Parameter userfile';  
        # hat der Parameter userfile einen Wert?  
        $datei ? print 'Dateiname vorhanden' : print 'Kein Name übergeben';  
        # weitere formale Prüfungen ...
        

        Siechfred

        --
        Ich bin strenggenommen auch nur interessierter Laie. (molily)