TimN: Dateiname bei Upload extrahieren?

Hi, ich bin neu in Perl eingestiegen und habe mir die meisten Sachen auch selbst erarbeitet. Aber hier komme ich irgendwie nicht so recht weiter. Ich habe bei mir zu Hause Spasseshalber mal einen Apache aufgesetzt, und dachte ich könnte ja mal ein paar PerlScripte laufen lassen. Darunter den Fileupload um den es hier geht.
Ich verwende CGI, hole mir mit param das file, und wie extrahiere ich jetzt den Dateinamen, um das später unter genau diesem wieder abzuspeichern?

Hier der Perl-Part, der denke ich benötigt wird.

#!C:\Perl\bin\perl -w

use warnings;

use CGI; # Modul fuer CGI-Programme
use Data::Dumper;

my $cgi = new CGI; # neues Objekt erstellen

Content-type fuer die Ausgabe

print $cgi->header(-type => 'text/html');

die datei-daten holen

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

Vielen Dank schon mal
TimN

  1. hi

    Ich verwende CGI, hole mir mit param das file, und wie extrahiere ich jetzt den Dateinamen, um das später unter genau diesem wieder abzuspeichern?

    was verstehst du unter extrahieren? den pfad vom namen trennen?

    steckl

    1. Hat sich erledigt, danke schön.

  2. Hell-O!

    Ich verwende CGI, hole mir mit param das file, und wie extrahiere ich jetzt den Dateinamen, um das später unter genau diesem wieder abzuspeichern?

    Was vom Client an den Browser als "Dateiname" übertragen wird, ist IIRC stark system- und browserabhängig. Eleganterweise splittest du den String, der als Dateiname in deinem Script ankommt, an jedem Slash bzw. Backslash auf, das letzte Element ist dein Dateiname:

    my $fullpath = CGI::param('myfile');  
    my $filename = (split /[\\\/], $fullpath)[-1];  
    print 'Filename is: ', $filename;
    

    Damit hast du alle Eventualitäten, die mir so einfallen, abgedeckt, also mit Slash, mit Backslash oder nur der Dateiname. Im Ergebnis hast du den Dateinamen dann in $filename stehen und kannst ihn weiter verwenden.

    Siechfred

    --
    Hier könnte Ihre Werbung stehen.
    Musikgeschmack || Steuerliche Einordnung des Rangrücktritts
    1. my $filename = (split /[\\\/], $fullpath)[-1];

      Muss natürlich so lauten:

      my $filename = (split /[\\\/]/, $fullpath)[-1];

      Siechfred

      --
      Hier könnte Ihre Werbung stehen.
      Musikgeschmack || Steuerliche Einordnung des Rangrücktritts
      1. Hi, Dank Dir für Deine schnelle Antwort.
        Das mit dem Splitten hatte ich schon gesehen, dachte es gäbe ne direktere Lösung. Naja, geht ja auch so.
        Danke nochmal
        TimN

        1. Hell-O!

          Das mit dem Splitten hatte ich schon gesehen, dachte es gäbe ne direktere Lösung.

          Die kann es nur dann geben, wenn du sicherstellen könntest, dass der dem Script übermittelte Pfad immer den gleichen Aufbau hat. Da man das aber im Webkontext auf Grund der verschiedenen Betriebssysteme und Browser nicht kann, bleibt dir halt nur so eine Lösung.

          Siechfred

          --
          Hier könnte Ihre Werbung stehen.
          Musikgeschmack || Steuerliche Einordnung des Rangrücktritts
    2. Hallo,

      [code lang=Perl]my $fullpath = CGI::param('myfile');
      my $filename = (split /[\/], $fullpath)[-1];
      Damit hast du alle Eventualitäten, die mir so einfallen, abgedeckt,

      Und was z.B. ist mit Mac-Dateinamen aus der Zeit vor OSX, die verwenden Doppelpunkte als Pfadtrennzeichen, oder VMS usw.

      Eleganter wäre der Einsatz von File::Basename, eventuell in Kombination mit einer Auswertung es Useragents (wobei mir klar ist, wie unzuverlässig diese Angabe ist).

      Grüße
        Klaus

  3. Hallo TimN,

    Ich verwende CGI, hole mir mit param das file, und wie extrahiere ich jetzt den Dateinamen, um das später unter genau diesem wieder abzuspeichern?

    Als Ergänzung noch: Verwende besser die upload()-Methode, um an den Datei-Inhalt heranzukommen. Diese erzeugt nämlich ein echtes Datei-Handle und erlaubt auch, zu prüfen, ob der Upload erfolgreich war.

    Gruß
    Patrick

    --
    "Die kürzeste EDV-Lüge: Es funktioniert..."