Perl - Upload
alligator
- perl
Servus zusammen,
ich bastle mir da grad ein Upload-Script.
$CGI::POST_MAX = MAX_FILE_SIZE;
my $file = $cgiquery->param('datei');
my $dateigroesse = (-s $file);
if ($dateigroesse < MAX_FILE_SIZE)
{
Lade Script hoch
}
else
{Ausgabe:
Datei zu groß
}
Naja mein Problem ist jetzt halt, dass das mit der Beschränkung nicht klappt. Er läd erst das ganze Zeug hoch bis er merkt, dass es zuviel ist und bricht dann ab. Manchmal mit der Ausgabe und manchmal "Datei zu groß" und manchmal mit "Die Seite kann nicht angezeigt werden."!
Somit hab 2 Probleme:
1. Wie bekomme ich es hin, dass er erst die Dateigröße überprüft bevor er hochlädt und dann durch $CGI::POST_MAX merkt dass es zu groß ist ?
2. Wie bekomme ich eine gescheite Fehlermeldung hin, wenn es nicht klappen sollte?
Vielen Dank schonmal für Hilfe.
cu
alligator
Hi,
ich bastle mir da grad ein Upload-Script.
$CGI::POST_MAX = MAX_FILE_SIZE;
my $file = $cgiquery->param('datei');
my $dateigroesse = (-s $file);
if ($dateigroesse < MAX_FILE_SIZE)
{
Lade Script hoch
}
else
{Ausgabe:
Datei zu groß
}
Naja mein Problem ist jetzt halt, dass das mit der Beschränkung nicht klappt. Er läd erst das ganze Zeug hoch bis er merkt, dass es zuviel ist und bricht dann ab. Manchmal mit der Ausgabe und manchmal "Datei zu groß" und manchmal mit "Die Seite kann nicht angezeigt werden."!
Somit hab 2 Probleme:
- Wie bekomme ich es hin, dass er erst die Dateigröße überprüft bevor er hochlädt und dann durch $CGI::POST_MAX merkt dass es zu groß ist ?
Frag vor dem Aufruf von CGI die ENV CONTENT_LENGT ab.
- Wie bekomme ich eine gescheite Fehlermeldung hin, wenn es nicht klappen sollte?
Genauso, wie wenn es klappt...
Content-Type ausgeben und Text ausprinten...
Ciao,
Wolfgang
use Greeting qw/:all/;
Frag vor dem Aufruf von CGI die ENV CONTENT_LENGT ab.
Ist das nicht genau das, was $CGI::POST_MAX macht?
Logisch ist imo, daß die Perl-Anwendung auf dem Server die Dateigröße erst dann bestimmen kann, wenn die Datei auch auf dem Server ist.
Ein Blick auf http://selfhtml.teamone.de/html/formulare/datei_upload.htm sollte sich lohnen:
<cite>
Wenn Sie das Attribut maxlength= angeben, sollte der Web-Browser die dahinter notierte Zahl als maximal erlaubte Dateigröße in Bytes interpretieren (maxlength = maximal length = maximale Länge). Im obigen Beispiel [..]
</cite>
somit würde der Browser bereits prüfen, ob die Datei zu groß ist; sollte imho *zusätzlich zu $CGI::POST_MAX eingesetzt werden (denn: weiß mann, ob auch wirklich *jeder Browser die Angabe interpretiert?). Probiers einfach mal aus.
K@rl
PS:
und manchmal mit "Die Seite kann nicht angezeigt werden."
-> hast Du da vielleicht ein Timeout-Problem?
Hoi,
Ein Blick auf http://selfhtml.teamone.de/html/formulare/datei_upload.htm
sollte sich lohnen:
[... maxlength ...]
somit würde der Browser bereits prüfen, ob die Datei zu groß ist;
sollte imho *zusätzlich zu $CGI::POST_MAX eingesetzt werden (denn:
weiß mann, ob auch wirklich *jeder Browser die Angabe
interpretiert?). Probiers einfach mal aus.
Tatsache ist, *kein* gaengiger Browser (ausser vielleicht dem Mozilla,
dort habe ich es noch nicht ausprobiert) verhaelt sich an dieser Stelle
richtig.
Gruesse,
c.j.k
Servus.
Also das mit der Browser-Abfrage mach ich nicht, da dass ja nicht sicher ist (siehe: http://selfhtml.teamone.de/html/formulare/datei_upload.htm )
Mit Content_Length lädt er es auch erst hoch, bevor er es weiss.
Heisst das jetzt, dass ich es nicht überprüfen kann bevor er es hochgeladen hat ? Das ist ja schon ziemlich Shit, denn wenn ich die Beschränkung auf 10 MB machen und jemand will 12 MB hochladen, dann merkt er des erst nachdem er ja schon 10 MB hochgeladen hat ?!?? Ist ja voll blöd.
Und mit der Fehlermeldung meinte ich, dass ich ja $CGI::POST_MAX = MAX_FILE_SIZE; gesetzt habe und wie kann ich es jetzt machen dass wenn der Wert überschritten wird meine Fehlermeldung kommt. Denn so wie ich es gezeigt habe geht es bis jetzt gemacht habe geht es nicht ?!
Danke für Hilfe.
cu
alligator
Servus Alligator,
Heisst das jetzt, dass ich es nicht überprüfen kann bevor er es hochgeladen hat ? Das ist ja schon ziemlich Shit, denn wenn ich die Beschränkung auf 10 MB machen und jemand will 12 MB hochladen, dann merkt er des erst nachdem er ja schon 10 MB hochgeladen hat ?!?? Ist ja voll blöd.
Für solche Sachen haben die Vorväter FTP erfunden. Ein HTTP-Dateiupload mit 10 MB ist imvho nicht so besonders sinnvoll. Ggf. ist es hier sinnvoller einen anomynous FTP freizuschalten. Daß man bei FTP die max. zu übertragende Dateigröße vorher festlegen / beschränken kann ist mir allerdings auch nicht bekannt.
Nur so am Rande: was eigentlich ist Deine Anwendung?
Grüße
K@rl
Hi,
naja FTP will ich nicht verwenden weil ich keinen Anonymus machen kann. Meine Anwendung... hmm. Ich will halt ein ganz normales File-Upload Script programmieren dass ich zum einen so einstellen kann, dass ich ne MB Begrenzung und ne Dateibegrenzung habe. Einfach so zum Spaß, da ich gern perle und nur so lernen kann. Es geht ja auch schon eigentlich bis auf das ich keine Fehlermeldung hin bekomme wenn das File zu groß ist, sondern der 500er Fehler kommt anstatt meine Fehlermeldung.
Hab auch schon
$uploaded_file = param('upload'); if (!$uploaded_file && cgi_error()) { print header(-status=>cgi_error()); exit 0; }
versucht laut perldoc halt, aber tut auch nicht ?!?
cu
alligator
Hi alligator,
das ich keine Fehlermeldung hin bekomme wenn das File zu groß ist, sondern der 500er Fehler kommt anstatt meine Fehlermeldung.
Hab' jetzt nicht die HTTP Returncodes im Kopf. 500 -> Server busy / Server not available / Server Error ... ?
Für mich ist nach wie vor die warscheinlichste These, daß Du bei einem großen Datei-Upload ein Timeout bekommst.
Ansonsten: gute Motivation! .. kenn' ich irgendwo her ;-)
Grüße
K@rl
Hi,
Ein Blick auf http://selfhtml.teamone.de/html/formulare/datei_upload.htm sollte sich lohnen:
Einer in den HTML-Standard lohnt noch mehr
http://www.w3.org/TR/html401/interact/forms.html#adef-maxlength:
maxlength = number [CN]
When the type attribute has the value "text" or "password", this attribute specifies the maximum number of characters the user may enter. This number may exceed the specified size, in which case the user agent should offer a scrolling mechanism. The default value for this attribute is an unlimited number.
Hier wird keinerlei Aussage darüber gemacht, was das maxlength bewirken soll, wenn das type-Attribut den Wert "file" hat.
somit würde der Browser bereits prüfen, ob die Datei zu groß ist; sollte imho *zusätzlich zu $CGI::POST_MAX eingesetzt werden (denn: weiß mann, ob auch wirklich *jeder Browser die Angabe interpretiert?). Probiers einfach mal aus.
Da nicht festgelegt ist, daß das maxlength-Attribut in diesem Fall überhaupt ausgewertet werden soll und schon gar nicht festgelegt ist, daß es als maximale Dateigröße zu interpretieren ist, würde ich einen Browser, der das tut, als fehlerhaft bezeichnen.
Andreas
Hi,
Ein Blick auf http://selfhtml.teamone.de/html/formulare/datei_upload.htm sollte sich lohnen:
Einer in den HTML-Standard lohnt noch mehr
http://www.w3.org/TR/html401/interact/forms.html#adef-maxlength:
[..]
Hier wird keinerlei Aussage darüber gemacht, was das maxlength bewirken soll, wenn das type-Attribut den Wert "file" hat.
in http://selfhtml.teamone.de/html/formulare/datei_upload.htm schreibt Stefan:
"Beachten Sie jedoch, dass diese Angabe mit Vorsicht zu genießen ist. In der HTML-Version 3.2 wurde es so bestimmt, in der Version 4.0 wird diese Funktionalität beim maxlength-Attribut dagegen nicht mehr erwähnt."
Hab' gerade mal in http://www.w3.org/TR/REC-html32 nachgesehen - du hast recht.
<!ENTITY % InputType
"(TEXT | PASSWORD | CHECKBOX | RADIO | SUBMIT
| RESET | FILE | HIDDEN | IMAGE)">
<!ELEMENT INPUT - O EMPTY>
<!ATTLIST INPUT
type %InputType TEXT -- what kind of widget is needed --
name CDATA #IMPLIED -- required for all but submit and reset --
value CDATA #IMPLIED -- required for radio and checkboxes --
checked (checked) #IMPLIED -- for radio buttons and check boxes --
size CDATA #IMPLIED -- specific to each type of field --
maxlength NUMBER #IMPLIED
src %URL #IMPLIED -- for fields with background images --
align %IAlign #IMPLIED -- vertical or horizontal alignment --
>
maxlength
Sets the maximum number of characters permitted in a text field.
=> ich werd' Stefan M. mal Bescheid geben. Danke für die Info.
Ciao
K@rl