Hallo,
Zuerste möchte ich Dich nochmals darauf hinweisen, daß es eine Doppelbedeutung bei CGI.pm gibt, Datei-Upload-Felder betreffend.
Einerseits ist es der Dateiname, andererseits auch ein Filehandle.
Anscheinend ist es so, daß, wenn Du den Dateinamen veränderst, automatisch auch der Filehandle verloren geht. (Ist mir etzt zu mühsam, mich in die Untiefen des CGI-Moduls zu begeben *g*)
So jetzt zu Deinen Problemen:
1.) IE
Du verwendest den vom Browser gesendeten Dateinamen auch für den Dateinamen am Server.
open (SERVER,">flyer/$$flyer") or die "Cant save $$flyer : $!\n";
(Zeile 113 in sub saveflyer)
Da es aber Browser gibt, welche nur den reinen Dateinamen, also z.B. 'blablabla.gif' senden, und welche die den ganzen Pfad Dir überantworten, also z.B. 'C:\wumptbumpti\blablabla.gif', gibts bei Dir schwierigkeiten, da 'flyer/C:\wumptbumpti\blablabla.gif' unter WIndows sicher kein gültiger Pfad ist, daher das 'Invalid Argument' in der Fehlermeldung. Abgesehen davon kann Perl von sich aus mit open() die notwendigen Verzeichnisstruktur anlegen, was auch gut so ist.
Du mußt also zuallererst einmal sicherstellen, daß in dem übergebenen Dateinamen keine Pfadangaben mehr vorkommen.
Entweder Du verwendest File::Basename, oder Du schreibst etwas eigenes.
BTW No.1: Relative Pfade in CGI-Scripts sind nicht gut, da Du nie genau weißt, welches Verzeichnis gerade das aktuelle Verzeichnis ist.
BTW No.2: Du solltest Dir angewöhnen, Deine Fehlermeldungen zu kennen, bzw. so zu kennzeichnen, daß Du auch weißt, daß sie von Dir sind, und wenns nur 'or die "sch..., schon wieder nix mit open $filename, $!";' ist.
2.) Doppelte Datei-Uploads
Die aufgrund der oben erwähnte Doppeldeutigkeiten auftretenden Probleme bekommst Du wahrschein lcih am einfachsten in den Griffen, wenn Du zuerst den Dateiinhalt in ein Array schreibst, dann den Dateinamen gradebiegst, und am Ende das Array in die Datei schreibst:
#im Initbereich des Scripts:
use File::Basename;
my $flyerdir = 'wo\auch\immer';
[...]
sub saveflyer
{
[...]
my @inhalt = <$$flyer>;
#wobei ich nicht verstehe, warum das eine Referenz sein muß, aber anyway...
my($filename) = getuniquefilename($flyerdir,$$flyer);
open(OUT,">$filename") or die "sch..., nic da mit open flyerfile $filename: Grund = $!";
binmode(OUT);
print OUT @array;
close(OUT);
[...]
}
#und die Funktion getuniquefilename
sub getuniquefilename
{
my($flyerdir,$orig_name) = @_;
my ($basename,$dmy,$suffix) = fileparse($orig_name,'..+');
my $counter=0;
my($guessname) = $basename
while(-e "$flyerdir/$guessname$suffix")
{
$counter++;
$guessname = "$basename$counter";
}
return "$flyerdir/$guessname$suffix";
}
Grüße
Klaus