$xNeTworKx: Uploadscript zerstört Grafiken / + IE speichert nicht mal

Beitrag lesen

Hallo,

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'

Achso, jetzt hab ich das endlich verstanden.

BTW No.1: Relative Pfade in CGI-Scripts sind nicht gut, da Du nie genau weißt, welches Verzeichnis gerade das aktuelle Verzeichnis ist.

Das hab ich nie genau verstanden. Was bedeutet 'das aktuelle Verzeichnis ist' ? Das Script ist doch immer im gleichen Verzeichnis, deswegen verstehe ich nicht, was da eigentlich gemeint 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.

Ja, ich vergebe immer, so weit es möglich ist pro open() verschiedene Fehlermeldungen, da ich sonst bei riesen Scripts den fehlerhaften open() nicht mehr finde. (Hat mir wirklich schon einige Male geholfen)

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";
}

Ok ich werd mir das sorgfältig durchsehen. Danke für die ausführliche Antwort.

$xNeTworKx.