Probleme mit Uploadscript (2)
$xNeTworKx
- perl
0 Klaus Mock0 $xNeTworKx
Hallo,
Ich habe vor einigen Tagen gefragt, wie ich nun am besten das Problem lösen kann, daß der IE bei Upload eines Bildes den ganzen Pfadnamen speichert. (Also zB C:/Bilder/foto.gif, was aber am Server dann als invalider Name für das Foto angesehen wird).
Es wurde mir hierbei empfohlen File::basename zu verwenden. Das Problem ist nur, daß hierbei doch auch das Bild zerstört wird, weil es ja quasi umbenannt wird und sobald ich an dem upgeloadeten Foto das Geringste ändere, ist das Foto kaputt (hat dann zB Größe 0). Was habe ich eigentlich noch für Optionen ?
Ich stelle noch mal das Script zur schau :
Hallo,
Es wurde mir hierbei empfohlen File::basename zu verwenden.
Ich kann mich erinnern;-)
Das Problem ist nur, daß hierbei doch auch das Bild zerstört wird,
Warum meinst Du das?
my $basename = basename($flyer);
Da sollte eigentlich nichts herumgepopelt werden.
BTW: hast Du das Source-Fragment versucht einzubinden?
Was habe ich eigentlich noch für Optionen ?
Wich damals schon sagte, könntest Du den Inhalt der Datei auch in den Speicher laden. SO groß sollten die Images ja gar nicht sein, daß das ein Problem ergäbe.
Noch etwas beim schnellen Hinsehen.
Man kann auch Rückgabewerte bei Funktionen verwenden. chkflyer() wäre IMHO der ideale Kanditat für so etwas.
my($error) = &chkflyer($flyer);
&anfang();
if($error eq '') {
&saveflyer($flyer);
&success($flyer);
}
else {
&eingabe();
&error($error);
}
&ende();
sub chkflyer{
my($flyer) = shift;
return "<li>Es wurde kein Pfad angegeben.</li>\n" if ($flyer eq '');
return "<li>Dieses Dateiformat ist ungültig. (*.jpg, *.gif oder *.png)</li>\n" if (($flyer ne '') && ($flyer !~ /^.+?.gif$|^.+?.jpg$|^.+?.png$/));
[...]
#hier noch die 'gute nachricht'
return '';
}
Naja, so in etwa.
Grüße
Klaus
Hallo,
Das Problem ist nur, daß hierbei doch auch das Bild zerstört wird,
Warum meinst Du das?
my $basename = basename($flyer);
Tut mir leid, aber wenn ich es so mache, kann es der IE zwar speichern, nur die Grafiken sind dann .jpg Dateien mit 0 Byte (bei allen Browsern) :(
if ($query->param('upload')) {
my $basename = $query->param('flyer');
$flyer = basename($basename);
.
.
.
Da sollte eigentlich nichts herumgepopelt werden.
BTW: hast Du das Source-Fragment versucht einzubinden?
Das Source-Fragment ?
Was habe ich eigentlich noch für Optionen ?
Wich damals schon sagte, könntest Du den Inhalt der Datei auch in den Speicher laden. SO groß sollten die Images ja gar nicht sein, daß das ein Problem ergäbe.
Hmmm wie genau müsste ich das machen und wie würde das mein Problem lösen ?
Noch etwas beim schnellen Hinsehen.
Man kann auch Rückgabewerte bei Funktionen verwenden. chkflyer() wäre IMHO der ideale Kanditat für so etwas.
my($error) = &chkflyer($flyer);
&anfang();
if($error eq '') {
&saveflyer($flyer);
&success($flyer);
}
else {
&eingabe();
&error($error);
}
&ende();
sub chkflyer{
my($flyer) = shift;
return "<li>Es wurde kein Pfad angegeben.</li>\n" if ($flyer eq '');
return "<li>Dieses Dateiformat ist ungültig. (*.jpg, *.gif oder *.png)</li>\n" if (($flyer ne '') && ($flyer !~ /^.+?.gif$|^.+?.jpg$|^.+?.png$/));
[...]
#hier noch die 'gute nachricht'
return '';
}
Hmmm ok das sieht besser aus, als meins, aber um den Feinschliff kümmere ich mich später :)
$xNeTworKx.
Hallo,
Tut mir leid, aber wenn ich es so mache, kann es der IE zwar speichern, nur die Grafiken sind dann .jpg Dateien mit 0 Byte (bei allen Browsern) :(
if ($query->param('upload')) {
my $basename = $query->param('flyer');
$flyer = basename($basename);
nein, hab' mich anscheinend etwas unglücklich ausgedrückt, mein Fehler:
my $flyer = $query->param('flyer');
my $orig_filename = basename($flyer);
open(OUT, ">$upload_dir/$orig_filename") or die "nix da mit schreiben $!";
binmode(OUT);
print OUT while(<$flyer>);
close(OUT);
Da sollte eigentlich nichts herumgepopelt werden.
BTW: hast Du das Source-Fragment versucht einzubinden?
Das Source-Fragment ?
Jenes, welches ich bei dem letzten Thread gepostet habe, und das jetzt sicher schon im Archiv ist.
Wich damals schon sagte, könntest Du den Inhalt der Datei auch in den Speicher laden. SO groß sollten die Images ja gar nicht sein, daß das ein Problem ergäbe.
Hmmm wie genau müsste ich das machen und wie würde das mein Problem lösen ?
Steht eigentlich auch im letzten Thread. Du weißt schon, der der jetzt schon im Archiv sein müßte;-)
my @dateiinhalt = $flyer;
my $orig_filename = basename($flyer);
open(OUT, ">$upload_dir/$orig_filename") or die "nix da mit schreiben $!";
binmode(OUT);
print OUT @dateiinhalt;
close(OUT);
Wie war das doch mit dem 'TIMTARITATIM' oder so, ich merk mir das nie:-(
Man kann auch Rückgabewerte bei Funktionen verwenden. chkflyer() wäre IMHO der ideale Kanditat für so etwas.
Hmmm ok das sieht besser aus, als meins, aber um den Feinschliff kümmere ich mich später :)
Die Erfahrung zeigt, daß, wenn es einmal irgendwie funktioniert (verd... schon wieder, das heißt ja jetzt neudeutsch 'funzen'), dann wird der Feinschliff meist 'übersprungen', also sollte man solche Sachen gleich von Anfang an machen. Es ist auch eine Übungssache, herauszufinden, welche der Möglichkeiten auf Dauer für bestimmte Anwendungsfälle sich als günstig erweisen. Und Übung ist nun mal die halbe Miete.
Grüße
Klaus
Hallo,
danke, du bist, wie schon so oft, mein Retter. Jetzt funktionierts auch im IE.