Upload Script Fehler
Jan
- perl
Hallo,
ich hoffe Ihr könnt mir bei diesem kleinen Problem helfen:
Ich habe ein einfach HTML Formular das eine Datei hochlädt.
Als Action ist folgendes Perl Script angebeben:
#!/usr/bin/perl -w
print "Content-type: text/html\n\n";
print "done";
exit;
Seltsamerweise dauert dieses Script sehr lange.
Es scheint als würde es erst ausgeführt werden sobald die Datei hochgeladen wurde.
Da ich vorher schon einiges testen möchte, zBsp. ob die Datei zu groß ist wäre mir das wichtig.
Was könnte am Server falsch eingestellt sein?
Bzw was mache ich falsch?
Grüße
Jan
Hi,
Seltsamerweise dauert dieses Script sehr lange.
Es scheint als würde es erst ausgeführt werden sobald die Datei hochgeladen wurde.
selbstverständlich, wann soll es denn sonst ausgeführt werden? Soll der Browser erkennen, dass das Script die Daten nicht benötigt und den Upload deswegen ohne die Datei-Daten durchführen?
Da ich vorher schon einiges testen möchte, zBsp. ob die Datei zu groß ist wäre mir das wichtig.
Um zu erkennen, ob die Datei zu groß ist, muss mindestens die Maximalgröße hochgeladen werden.
Was könnte am Server falsch eingestellt sein?
Deine Vorstellung.
Cheatah
Komischer weise funktioniert das auf einem anderen Server.
Es wird erst eine Verbindung aufgebaut und dann werden die Daten Stückchenweise rübergeschoben.
Wie sollten in Deiner Vorstellung denn CGI->Hooks funktionieren wenn der Code immer erst nach dem Upload ausgeführt wird.
Würde mich über Posts mit mehr Hintergrundwissen freuen.
Jan
Hi Jan!
Ich weiß, dass Cheatah nicht immer den Liebreiz einer gutmütigen Großmuter versprüht, aber Deine Reaktion ist etwas überzogen - IMHO.
Komischer weise funktioniert das auf einem anderen Server.
Nein - Beweis durch Behauptung ist nicht das Mittel zum Ziel in diesem Forum!
Es wird erst eine Verbindung aufgebaut und dann werden die Daten Stückchenweise rübergeschoben.
Ich unterstelle mal: Du meinst das Richtige - wer hat Anderes behauptet?
Wie sollten in Deiner Vorstellung denn CGI->Hooks funktionieren wenn der Code immer erst nach dem Upload ausgeführt wird.
_Server_seitig ausgeführter Code wird _immer und nur nach_ der Anforderung des Clienta an die serverseitigen Ressource ausgeführt.
Würde mich über Posts mit mehr Hintergrundwissen freuen.
Meinen Glückwunsch: Du hast gerade die Hilfe des Stammposters mit dem - mit Abstand - größten 'Hintergrundwissen' ausgeschlagen und /versucht/, ihm 'vor´s Bein zu pinkeln' - erwarte also nicht mehr all zu viel.
Nur noch so aus dem Bauch heraus: frag anders!
Dann bekommst Du Hilfe, denke ich.
off:PP
Hi!
Wer ein 't' zuwenig und ein 'a' statt eines 's' in meiner Antwort findet darf alles behalten und daraus demnächst einen sinnvollen Beitrag basteln - sorry!
Ich bin müde und werde nun besser schlafen - bonne nuit.
off:PP
Hallo Peter Pan,
vielen Dank für deinen hilfreichen Beitrag zu meinem Problem.
Es hatte genauso wenig Inhalt wie der letzte Beitrag.
Nochmal vereinfacht:
Nach dem Anklicken des 'submit' Buttons wird das Perl Script gewöhnlicherweise aufgerufen.
Mein Problem ist das es auf diesem Server erst dann aufgerufen wurde, nachdem die komplette Datei also zb 100mb komplett auf meinem Server hochgeladen wurde.
Ich möchte nichts durch Behauptungen beweisen - ich war nur schockiert über so einen Beitrag.
Hi there,
Nochmal vereinfacht:
Nach dem Anklicken des 'submit' Buttons wird das Perl Script gewöhnlicherweise aufgerufen.
Ich versteh' zwar nix von Perl, aber genaugenommen rufst Du mit dem submit-Button kein Perlskript auf, sondern Du forderst einen Ressource an.
Mein Problem ist das es auf diesem Server erst dann aufgerufen wurde, nachdem die komplette Datei also zb 100mb komplett auf meinem Server hochgeladen wurde.
Naja, was immer Du vorhast, aber das ist ja irgendwie sinnvoll, denn wie könnte ein vorher startendes Skript wissen, wie gross die Datei ist, wenn sie noch nicht komplett am Server liegt? Denn selbst wenn Du in Deinem submit-Request die Dateigrösse mitschickst (so Du diese kennst) kann sich ein am Server laufendes Skript auf eine solche Angabe unmöglich verlassen. Sämtliche im Perlskript vorkommenden Schritte, die irgendetwas mit der Dateigröße zu tun haben, machen erst nach dem Upload wirklich Sinn.
Ich möchte nichts durch Behauptungen beweisen - ich war nur schockiert über so einen Beitrag.
kein Grund sich aufzuregen, der hat irgendein Problem, der macht sowas immer...
Die Variable $ENV{'CONTENT_LENGTH'} beinhaltet die Größe des Queries.
Ich möchte einen CGI Hook ansetzen um eine AJAX Progressbar anzuzeigen und das Script läuft auf diesem Server nicht wegen dem beschriebenen Problem.
Ich habe allerdings mit Absicht ein sehr einfaches Beispiel gewählt um das Problem zu beschreiben.
Hi there,
ich hab' wie gesagt, von Perl keine Ahnung, mir ist aber nun klar, wie das funktionieren sollte.
Die Variable $ENV{'CONTENT_LENGTH'} beinhaltet die Größe des Queries.
schon, aber wenn CONTENT_LENGTH in etwa die Anzahl der übertragenen/upgeloadeten Bytes ist, was ich einmal vermute, dann ist mir wie gesagt nicht klar, wie das skript, das gleich losstartet, den Wert dieser Variablen kennen soll, solange nicht das letzte Bit 'raufgeladen wurde.
Ich möchte einen CGI Hook ansetzen um eine AJAX Progressbar anzuzeigen und das Script läuft auf diesem Server nicht wegen dem beschriebenen Problem.
selbst wenn es Dir gelingen sollte, die Anzahl der bereits hochgeladenen Bytes für Dein clientseitiges (nehm' einmal an javascript) Skript zu ermitteln, hast Du für eine Progressbar zuwenig Information, da Du die Gesamtgrösse nicht kennst. Javascript weiss es beim Wegschicken nicht und Perl nicht vor Beendigung des Uploads, egal wann Dein Skript startet.
Eine Progressbar für einen Upload ist imho aus grundsätzlichen Erwägungen nicht zu realisieren, egal in welchen Skript- oder Programmiersprachen. (Ausser mit irgendwelchen abgefahrenen ActivX-Komponenten oder ähnlichem, die Ausflüge ins lokale Dateisystem machen dürfen...)
Ich habe allerdings mit Absicht ein sehr einfaches Beispiel gewählt um das Problem zu beschreiben.
Uber Uploader ( http://uber-uploader.sourceforge.net/ ) funktioniert genauso wie mein Script und wird von vielen Leuten benutzt.
Also bitte sagt mir nicht die ganze Zeit was eurer Meinung unsinnig ist oder nicht geht - sondern wie ich es zum laufen bekomme das mein Script sofort aufgerufen wird und nicht nach Beendingung des Uploads
Uber Uploader ( http://uber-uploader.sourceforge.net/ ) funktioniert genauso wie mein Script und wird von vielen Leuten benutzt.
Dann schau's dir mal genauer an. Die Datei wird übertragen und während der Übertragung, kannst du die Größe der temporären Datei die dabei erzeugt wird, mit einem anderen Skript abfragen. Dieser Mechanimus wird von dem CGI Modul zu Verfügung gestellt und funktionmiert erst ab der CGI Version 3.x
Also bitte sagt mir nicht die ganze Zeit was eurer Meinung unsinnig ist oder nicht geht - sondern wie ich es zum laufen bekomme das mein Script sofort aufgerufen wird und nicht nach Beendingung des Uploads
So ist es aber.
Struppi.
Ich weiß wie das funktioniert allerdings muss dazu dieses Code ausgeführt werden bevor der Upload ausgeführt wird.
UberUploader funktioniert ebenfalls nicht.
Hi,
Ich weiß wie das funktioniert allerdings muss dazu dieses Code ausgeführt werden bevor der Upload ausgeführt wird.
damit schließt Du serverseitige Mechanismen aus. Ich schlage vor, Du beschränkst den Zugriff auf IE-Nutzer mit aktivem ActiveX und baust ein entsprechendes Control.
Cheatah
(Hallo|Hi(ho)|Nabend) Jan,
Ich weiß wie das funktioniert allerdings muss dazu dieses Code ausgeführt werden bevor der Upload ausgeführt wird.
Dann scheinst du doch nicht zu wissen, wie es funktioniert.
Leider ist zumindest dieser Teil des CGI-Moduls spärlich dokumentiert.
Also zumindest gibt es keine kostenfreien Quellen im WWW.
Ganz kurz: Schreib eine Funktion, welche die entsprechenden Parameter entgegennimmt und auswertet.
Die hängst du dann beim Erzeugen des CGI-Objektes ein:
# upload-hook for CGI.pm
sub upload_hook {
my (
$file_name, # temp file name
$buffer, #
$bytes_read,
$umid
) = @_;
# ... verarbeite diese Daten
}
# ...
my $cgi = CGI->new(\&upload_hook);
# ...
UberUploader funktioniert ebenfalls nicht.
Ich kann mich entsinnen, dass der UberUploader Anfang 2007 noch halbwegs funktioniert hat.
Das war das letzte Mal, dass ich mich mit Fileuploads und dazugebastelten Progress-Bars beschäftigen musste.
Allerdings fand ich das Script noch unübersichtlicher als meine Lösung -- und die war
schon schlecht (haufenweise globale Variablen).
MffG
EisFuX
Hallo EisFuX,
mein Problem ist das dein Code:
sub upload_hook {
my (
$file_name, # temp file name
$buffer, #
$bytes_read,
$umid
) = @_;
# ... verarbeite diese Daten
}
# ...
my $cgi = CGI->new(\&upload_hook);
ausgeführt wird nachdem mein File komplett auf dem Server transferiert wurde.
Der CGI Hook wird dann einmal ausgeführt und das wars.
Das ist auch mein Problem das genau dieser Code nicht funktioniert.
Leider kennen scheinbar 99% der Perl Programmierer diesen Hook nicht und ihnen ist scheinbar nicht klar das es nötig ist diesen Hook aufzusetzen bevor man den eigentlichen Datei-Transfer startet.
Der Ablauf ist folgender:
1: User klickt auf abschicken
2: Das .pl Script startet
3: Hook registrieren
4: Zugriff auf bestimmte bereiche des CGI Moduls die den File Transfer starten
5: Wärend des Uploads wird immer wieder der Hook ausgeführt
6: Zugriff auf das Filehandle der Uploads is möglich
7: Ausgabe des Perl Scripts
Bei mir ist der Ablauf allerdings anders und ich denke das das an einer Servereinstellung liegt:
1: User klickt auf abschicken
2: File Transfer startet
3: File Transfer ist abgeschlossen
4: Das .pl Script startet
5: Registrieren des Hooks
...
Grüße Jan
Es wird erst eine Verbindung aufgebaut und dann werden die Daten Stückchenweise rübergeschoben.
Ja, aber nicht das Skript gestartet.
Wie sollten in Deiner Vorstellung denn CGI->Hooks funktionieren wenn der Code immer erst nach dem Upload ausgeführt wird.
Das was du meinst, sind Skripte, die parallel den upload Status beobachten. Das Skript, dass den upload entgegen nimmt, hat damit nichts zu tun.
Struppi.
Seltsamerweise dauert dieses Script sehr lange.
Es scheint als würde es erst ausgeführt werden sobald die Datei hochgeladen wurde.
Kann es sein, dass diese Frage dir schon einmal beantwortet wurde?
http://forum.de.selfhtml.org/archiv/2009/4/t185966/#m1234768
Struppi.
Nein,
genau wie beim letzten mal ist keiner in der Lage mir zu helfen da die CGI->Hook funktion scheinbar nicht bekannt ist.
Du hattest mir damals erzählt was es für Timer, das hatte nichts mit dem Thema zu tun.
Meine Frage dreht sich darum wieso der Request nicht weitergeleitet wird sondern erst die Datei auf meinen Server hochgeladen wird und dann mein Script ausgeführt wird - je nach Dateigröße sind das Minuten nach dem absenden des Requests..
Meine Frage dreht sich darum wieso der Request nicht weitergeleitet wird sondern erst die Datei auf meinen Server hochgeladen wird und dann mein Script ausgeführt wird - je nach Dateigröße sind das Minuten nach dem absenden des Requests..
Genau so passiert es und das kannst du nicht ändern. Das Skript wird erst gestartet wenn die Datei vollständig auf dem Server ist.
Struppi.