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.