Dateiname bei Upload extrahieren?
TimN
- perl
0 steckl0 TimN
0 Siechfred0 Siechfred2 Klaus Mock
0 Patrick Canterino
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
print $cgi->header(-type => 'text/html');
my $file = $cgi->param("myfile");
Vielen Dank schon mal
TimN
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
Hat sich erledigt, danke schön.
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
my $filename = (split /[\\\/], $fullpath)[-1];
Muss natürlich so lauten:
my $filename = (split /[\\\/]/, $fullpath)[-1];
Siechfred
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
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
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
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