$xNeTworKx: Probleme mit Uploadscript (2)

Hallo,

Ich habe vor einigen Tagen gefragt, wie ich nun am besten das Problem lösen kann, daß der IE bei Upload eines Bildes den ganzen Pfadnamen speichert. (Also zB C:/Bilder/foto.gif, was aber am Server dann als invalider Name für das Foto angesehen wird).
Es wurde mir hierbei empfohlen File::basename zu verwenden. Das Problem ist nur, daß hierbei doch auch das Bild zerstört wird, weil es ja quasi umbenannt wird und sobald ich an dem upgeloadeten Foto das Geringste ändere, ist das Foto kaputt (hat dann zB Größe 0). Was habe ich eigentlich noch für Optionen ?
Ich stelle noch mal das Script zur schau :

http://www.acid4u.com/uploadflyer.txt

  1. Hallo,

    Es wurde mir hierbei empfohlen File::basename zu verwenden.

    Ich kann mich erinnern;-)

    Das Problem ist nur, daß hierbei doch auch das Bild zerstört wird,

    Warum meinst Du das?
    my $basename = basename($flyer);

    Da sollte eigentlich nichts herumgepopelt werden.
    BTW: hast Du das Source-Fragment versucht einzubinden?

    Was habe ich eigentlich noch für Optionen ?

    Wich damals schon sagte, könntest Du den Inhalt der Datei auch in den Speicher laden. SO groß sollten die Images ja gar nicht sein, daß das ein Problem ergäbe.

    http://www.acid4u.com/uploadflyer.txt

    Noch etwas beim schnellen Hinsehen.
    Man kann auch Rückgabewerte bei Funktionen verwenden. chkflyer() wäre IMHO der ideale Kanditat für so etwas.
    my($error) = &chkflyer($flyer);
    &anfang();
    if($error eq '')  {
       &saveflyer($flyer);
       &success($flyer);
       }
    else  {
       &eingabe();
       &error($error);
       }
    &ende();

    sub chkflyer{
    my($flyer) = shift;
    return  "<li>Es wurde kein Pfad angegeben.</li>\n" if ($flyer eq '');
    return  "<li>Dieses Dateiformat ist ungültig. (*.jpg, *.gif oder *.png)</li>\n" if (($flyer ne '') && ($flyer !~ /^.+?.gif$|^.+?.jpg$|^.+?.png$/));
    [...]
    #hier noch die 'gute nachricht'
    return '';
    }

    Naja, so in etwa.

    Grüße
      Klaus

    1. Hallo,

      Das Problem ist nur, daß hierbei doch auch das Bild zerstört wird,

      Warum meinst Du das?
      my $basename = basename($flyer);

      Tut mir leid, aber wenn ich es so mache, kann es der IE zwar speichern, nur die Grafiken sind dann .jpg Dateien mit 0 Byte (bei allen Browsern) :(

      if ($query->param('upload'))  {
      my $basename = $query->param('flyer');
      $flyer = basename($basename);
      .
      .
      .

      Da sollte eigentlich nichts herumgepopelt werden.
      BTW: hast Du das Source-Fragment versucht einzubinden?

      Das Source-Fragment ?

      Was habe ich eigentlich noch für Optionen ?

      Wich damals schon sagte, könntest Du den Inhalt der Datei auch in den Speicher laden. SO groß sollten die Images ja gar nicht sein, daß das ein Problem ergäbe.

      Hmmm wie genau müsste ich das machen und wie würde das mein Problem lösen ?

      http://www.acid4u.com/uploadflyer.txt

      Noch etwas beim schnellen Hinsehen.
      Man kann auch Rückgabewerte bei Funktionen verwenden. chkflyer() wäre IMHO der ideale Kanditat für so etwas.
      my($error) = &chkflyer($flyer);
      &anfang();
      if($error eq '')  {
         &saveflyer($flyer);
         &success($flyer);
         }
      else  {
         &eingabe();
         &error($error);
         }
      &ende();

      sub chkflyer{
      my($flyer) = shift;
      return  "<li>Es wurde kein Pfad angegeben.</li>\n" if ($flyer eq '');
      return  "<li>Dieses Dateiformat ist ungültig. (*.jpg, *.gif oder *.png)</li>\n" if (($flyer ne '') && ($flyer !~ /^.+?.gif$|^.+?.jpg$|^.+?.png$/));
      [...]
      #hier noch die 'gute nachricht'
      return '';
      }

      Hmmm ok das sieht besser aus, als meins, aber um den Feinschliff kümmere ich mich später :)

      $xNeTworKx.

      1. Hallo,

        Tut mir leid, aber wenn ich es so mache, kann es der IE zwar speichern, nur die Grafiken sind dann .jpg Dateien mit 0 Byte (bei allen Browsern) :(

        if ($query->param('upload'))  {
        my $basename = $query->param('flyer');
        $flyer = basename($basename);

        nein, hab' mich anscheinend etwas unglücklich ausgedrückt, mein Fehler:

        my $flyer = $query->param('flyer');

        in $flyer ist zum einen der Dateiname(inkl. allfälligem Pfad ->IE)

        zu finden, zum anderen ist es auch als Dateihandle zu verwenden.

        my $orig_filename = basename($flyer);

        in $orig_filename steht jetzt nur der Dateiname, ohne Pfad

        $flyer wird jetzt als Dateiname gebraucht, aber nicht verändert

        open(OUT, ">$upload_dir/$orig_filename") or die "nix da mit schreiben $!";
        binmode(OUT);
        print OUT while(<$flyer>);

        $flyer wird jetzt als Dateihandle gebraucht, was auch funktionieren

        (äh funzen) sollte, da wir ja oben keine Veränderung am

        Variableninhalt von $flyer durchgeführt haben.

        close(OUT);

        Da sollte eigentlich nichts herumgepopelt werden.
        BTW: hast Du das Source-Fragment versucht einzubinden?

        Das Source-Fragment ?

        Jenes, welches ich bei dem letzten Thread gepostet habe, und das jetzt sicher schon im Archiv ist.

        Wich damals schon sagte, könntest Du den Inhalt der Datei auch in den Speicher laden. SO groß sollten die Images ja gar nicht sein, daß das ein Problem ergäbe.

        Hmmm wie genau müsste ich das machen und wie würde das mein Problem lösen ?

        Steht eigentlich auch im letzten Thread. Du weißt schon, der der jetzt schon im Archiv sein müßte;-)

        my  @dateiinhalt = $flyer;
        my $orig_filename = basename($flyer);
        open(OUT, ">$upload_dir/$orig_filename") or die "nix da mit schreiben $!";
        binmode(OUT);
        print OUT @dateiinhalt;
        close(OUT);

        Wie war das doch mit dem 'TIMTARITATIM' oder so, ich merk mir das nie:-(

        Man kann auch Rückgabewerte bei Funktionen verwenden. chkflyer() wäre IMHO der ideale Kanditat für so etwas.
        Hmmm ok das sieht besser aus, als meins, aber um den Feinschliff kümmere ich mich später :)

        Die Erfahrung zeigt, daß, wenn es einmal irgendwie funktioniert (verd... schon wieder, das heißt ja jetzt neudeutsch 'funzen'), dann wird der Feinschliff meist 'übersprungen', also sollte man solche Sachen gleich von Anfang an machen. Es ist auch eine Übungssache, herauszufinden, welche der Möglichkeiten auf Dauer für bestimmte Anwendungsfälle sich als günstig erweisen. Und Übung ist nun mal die halbe Miete.

        Grüße
          Klaus

        1. Hallo,
          danke, du bist, wie schon so oft, mein Retter. Jetzt funktionierts auch im IE.