Dateiname bei File-Upload
sprain
- perl
Hallo,
Ich habe folgendes Problem:
Per Formular und Perl mache ich einen FileUpload. Nun ist es so, dass, wenn ich eine Datei von Windows hochlade der ganze Pfad als Dateinname angegeben wird, also z.B. "C:\Verzeichnis\bild.jpg" anstatt nur "bild.jpg". Auf einem Mac funktionierts aber.
Weiss jemand Rat?
Ciao & Danke, sprain
Hier noch der Code, wenns hilft :-)
Im HTML:
********
<form action="../../cgi-bin/facelifting/facelifting.cgi" method="post" enctype="multipart/form-data">
[... andere Formularteile ...]
<input type="file" name="file1" class="button">
[... andere Formularteile ...]
</form>
im Perl-Skript:
***************
#************************************************
$fname = $file1;
upload();
sub upload{
$fname =~ s/ /\_/gi;
$fname =~ s/ä/\ae/gi;
$fname =~ s/ö/\oe/gi;
$fname =~ s/ü/\ue/gi;
$fname =~ s/Ä/\Ae/gi;
$fname =~ s/Ö/\Oe/gi;
$fname =~ s/Ü/\Ue/gi;
open(DAT, ">$SAVE_DIRECTORY/$fname") || die 'Error processing file: ',$!;
binmode $file;
binmode DAT;
my $data;
while(read $file,$data,1024) {
print DAT $data;
}
close DAT;
}
Moin,
wenn ich eine Datei von Windows hochlade der ganze Pfad als Dateinname angegeben wird, also z.B. "C:\Verzeichnis\bild.jpg" anstatt nur "bild.jpg".
Es liegt nicht wirklich nur an Windows, sondern in erster linie am Client.
IE macht es so, mozilla benimmt sich (mittlerweile)
folgende Zeile schnippelt so lange von vorne an dem File namen rum, bis kein
backslash mehr da ist.
while ($fname =~ /\/) { $fname =~ s/^.*\//; }
HTH,
bye eddie
Hi,
Ich habe folgendes Problem:
Per Formular und Perl mache ich einen FileUpload. Nun ist es so, dass, wenn ich eine Datei von Windows hochlade der ganze Pfad als Dateinname angegeben wird, also z.B. "C:\Verzeichnis\bild.jpg" anstatt nur "bild.jpg". Auf einem Mac funktionierts aber.
Weiss jemand Rat?
Du brauchst mehr Rat :)
Frage mal: Koennte nicht ein boeser Mensch -wie z.B. ein BWfH-
auf die Idee kommen, ein modifiziertes Formular und modifizierte Dateinamen fuer den Upload zu verwendden um eine Datei mit so einem Namen aufzurufen:
"blafasel.txt|rm+-Rf+*"
(Das testest du jetzt aber nicht aus!!!!)
Wie auch immer: Sorg dafuer das alle Eingaben der
User nichts anrichten koennen.
Unten ein Vorschlag:
...
$fname =~ s/[a-z-A-Z0-9-_/\:.]+//gi;
my @parts = split(/[/\]+/,$fname);
my $filename = pop(@parts);
if (-r "$SAVE_DIRECTORY/$fname") {
print STDERR "Ueberschreibe alte Datei...\n";
}
open(DAT, ">$SAVE_DIRECTORY/$fname") || print STDERR 'Error processing file: ',$!;
...
Uebrigens ist ein die()-Aufruf in ein CGI-Skript unschoen.
Ciao,
Wolfgang