Javascript und Perl parallel in Frames ausführen lassen
moritz
- javascript
Hallo,
ich wollte ein Upload-Formular mit Fortschrittsanzeige basteln, da bei größeren Dateien der Upload ohne Ahnung wie lange das noch dauert schon ziemlich deprimiertend ist.
Realisiert habe ich es bisher über zwei Frames:
In frame a) wird ein CGI-Script aufgerufen um die Datei hochzuladen
In frame b) wird ein javascript/ajax script aufgerufen, welcher in intervallen prüft wieviel von der datei schon hochgeladen worden ist.
Das ganze würde eigentlich klappen, wenn das Perl-Script den Javascript-Frame b) nicht blockieren würde. Das heißt dieser wird erst ausgeführt, wenn das Perl script fertig ist.
Den Javascript-frame in einem Popup Fenster zu öffnen bringt leider das selbe Ergebnis.
Ist das jetzt ein grundsätzliches Problem zwischen Perl und Javascript oder hab ich scheinbar irgendwas falsch gemacht? Ich kann gerne auch Code posten, da jedoch eigentlich alles funzt und die komplette Datei zu lang wär lass ich es erstmal.
Grüße,
moritz
Hi,
In frame a) wird ein CGI-Script aufgerufen um die Datei hochzuladen
Du meinst, es wird eine Datei hochgeladen, und vermutlich erst danach serverseitig ein Script ausgeführt.
In frame b) wird ein javascript/ajax script aufgerufen, welcher in intervallen prüft wieviel von der datei schon hochgeladen worden ist.
Das ganze würde eigentlich klappen, wenn das Perl-Script den Javascript-Frame b) nicht blockieren würde. Das heißt dieser wird erst ausgeführt, wenn das Perl script fertig ist.
Frames werden nicht "ausgeführt".
Ist das jetzt ein grundsätzliches Problem zwischen Perl und Javascript oder hab ich scheinbar irgendwas falsch gemacht? Ich kann gerne auch Code posten, da jedoch eigentlich alles funzt und die komplette Datei zu lang wär lass ich es erstmal.
Beschreibe erst mal, was du gemacht hast.
Und wenn Code-Beispiele, dann natürlich auf ein wesentliches Minimum reduziert.
MfG ChrisB
Ok. Ich versuchs nochmal. Wird aber länger...
Also zuerst habe ich ein normales html Formular mit datei-upload (bzw. es sollen 10 sein) feld etc., und zwei iframes.
Per onSubmit "leite" ich das formular zuerst in das 1. frame zu einer seite, auf welcher der javascript/ajax Loader kommt.
Dann führe ich das Formular mit dem zweiten Frame als Ziel aus, um es an das cgi/perl script zu leiten:
// formular in frame 1 ausfuehren
window.setTimeout('window.document.forms[\'multiupload-form\'].submit();', 1);
// formular veraendern und in frame 2 ausfuehren
window.setTimeout('window.document.forms[\'multiupload-form\'].target = "perluploader-frame";', 2);
window.setTimeout('window.document.forms[\'multiupload-form\'].action = "/cgi-bin/wexler_multiupload.pl";', 2);
window.setTimeout('window.document.forms[\'multiupload-form\'].submit();', 2);
Das Perl-Script ist im Groben dem Beispiel von Christian Kruse auf SELFHTML entnommen.
Im 1. frame, beim javascript/ajax-loader, wird zuerst ein php-script ausgeführt um per $_FILES['uploaddata']['size'];
die Dateigröße der hochzuladenden Datei in ein textfeld zu schreiben um es für javascript verfügbar zu machen.
Dann wird in javascript Intervallen ein ajax code ausgeführt, welcher einer PHP-Datei den Dateinamen übergibt. Diese prüft deren aktuelle größe auf dem Server und gibt sie an das ajax-script zurück.
Die beiden Dateigrößen kann ich jetzt einfach miteinander vergleichen, die neue größe ins Browserfenster schreiben und bei 100% die Intervalle abbrechen, bzw. zur nächsten hochzuladenden Datei übergehen.
Das ganze in versucht-kurzer-codeform:
// alle zehn sekunden testen
var LoaderIntervall = window.setInterval("IntervallFunktion()", 1000);
function IntervallFunktion () {
//alle 10 moeglichen filesize-felder testen
if (i<=10) {
//die abfrage ob das von php generierte filesize-feld ueberhaupt exitiert lass ich hier mal weg...
filesize = document.getElementById('filesize_' + i).value;
name = document.getElementById('filename_' + i).value;
tempname = document.getElementById('tempname_' + i).value;
/*** - Ajax Funktion CheckFilesize ***/
function AjaxFunktion (action, get) {
var http = null;
function AusgabeSchreiben() {
if (http.readyState == 4) {
var temp_filesize = http.responseText;
//neue dateigroesse in div schreiben
document.getElementById('xbytesfrom_' + i).innerHTML = temp_filesize;
//bei gleicher dateigroesse zur naechsten datei gehen
if (temp_filesize >= filesize) { ++i; }
}
}
if (window.XMLHttpRequest) {
http = new XMLHttpRequest();
} else if (window.ActiveXObject) {
http = new ActiveXObject("Microsoft.XMLHTTP");
}
if (http != null) {
//php-datei nach aktueller dateigroesse abfragen
http.open("GET", "multiuploader.php?" + action + get, true);
http.onreadystatechange = AusgabeSchreiben;
http.send(null);
}
}
AjaxFunktion("get_file_size", "&tempname=" + tempname);
}
//Intervall bei 10 beenden
window.clearInterval(LoaderIntervall);
}
Sorry, aber kürzer hab ichs nicht hinbekommen...
Unter http://a-simeon.de/multiuploader.php kann das Script gerne ausprobiert werden.
Der Fehler scheint mir aber nicht im javascript/ajax-loader zu liegen, da im 1. frame jegliche html-ausgabe erst erfolgt, wenn das perl-script fertig ist.
Vielleicht ist meine doppelte javascript-ausführung des Formulars mit setTimeout auch falsch... Aber ohne das setTimeout wird es nicht zweimal ausgeführt.
Für Ideen wäre ich sehr dankbar,
Grüße, moritz.
Hi,
Also zuerst habe ich ein normales html Formular mit datei-upload (bzw. es sollen 10 sein) feld etc., und zwei iframes.
Per onSubmit "leite" ich das formular zuerst in das 1. frame zu einer seite, auf welcher der javascript/ajax Loader kommt.
Dann führe ich das Formular mit dem zweiten Frame als Ziel aus, um es an das cgi/perl script zu leiten:
Also startest du das Versenden und damit den kompletten Upload aller Daten zwei mal - das ist schon mal extrem blödsinnig.
Im 1. frame, beim javascript/ajax-loader, wird zuerst ein php-script ausgeführt um per
$_FILES['uploaddata']['size'];
die Dateigröße der hochzuladenden Datei in ein textfeld zu schreiben um es für javascript verfügbar zu machen.
Dabei *wurde* die Datei bereits hochgeladen, und das PHP-Script startet natürlich erst, nachdem diese abgeschlossen ist.
Der Fehler scheint mir aber nicht im javascript/ajax-loader zu liegen
Nein - eher im schon vollkommen unsinnigen Ansatz.
Vielleicht ist meine doppelte javascript-ausführung des Formulars mit setTimeout auch falsch...
Das komplette Konzept ist absoluter Murks.
Du lässt die Datei(en) komplett hochladen, verwirfst diese Daten aber wieder, und interessiert dich nur für die Dateigrösse - um dann anschliessend bei einem zweiten, noch mal genau gleich grossen Request eine Zeit ermitteln zu wollen, wie lange dieser noch dauert ... Humbug hoch zwei.
Du hast also offenbar die Zusammenhänge und technischen Abläufe bei so einem Upload und seiner anschliessenden serverseitigen Verarbeitung noch nicht mal ansatzweise verstanden.
Informiere dich also zunächst darüber - und dann, welche bestehenden Ansätze und Möglichkeiten des bereits gibt, den Fortschritt zu ermitteln (Flash; "file upload hooks" bei PHP, etc.)
MfG ChrisB
Hallo,
ist wohl richtig.
Habs immer nur lokal probiert und dadurch den eindruck bekommen, dass das php-script die dateigröße irgendwie aus dem html formular bekommt, was natürlich quatsch ist - insofern: alles scheiße...
Trotzdem könntest du, wie ich finde, ein bissel an deinem Umgangston üben - deine herablassende Arroganz ist nicht gerade nett.
Grüße,
moritz
Ließ doch mal das Content-Length des Headers aus, der Upload-Datei, da kannste sehen wie (ca.) Gross die Datei ist, anhang der Geschwindigkeit die du *auch* ermitteln kannst, kannst du die Restdauer sehen.
Moin Moin!
Perl läuft auf dem Server, Javascript auf dem Client (obwohl die jeweils andere Position auch möglich ist, ist sie extrem unwahrscheinlich). Deine Beobachtung ist also schonmal mindestens verwirrt.
Frames machen Dein Problem nicht einfacher.
Ich rate mal ins Blaue hinein, dass Du ein Locking-Problem auf dem Server hast. Zeige den RELEVANTEN Teil des Codes und/oder einen Link auf die Webseite, dann können wir qualifiziert über Dein Problem diskutieren.
Alexander