Guten Abend,
ich versuche mehrere Downloads auf einer Seite zu starten, ohne dass
dabei mein Script unterbrochen wird.
Ich erstelle also entsprechend viele unsichtbare Frames denen ich denn in der Eigenschaft „src“ den Link auf einen Octet-Stream zuweise.
Wenn ich Frame 1 nun einen Link zuordne wird die Datei heruntergeladen, weise ich aber vor Abschluss des Downloads Frame 2 einen Link zu, so wird der download der Datei 1 abgebrochen.
Woran liegt das und wie kann ich das umgehen?
Gruß,
Vito
Das hängt imho vom Browser ab, nicht davon wie du die Downloads anbietest.
mal abgesehen davon, dass das sowieso „murks“ ist (download über frames), wie heissen deine frames denn ?
so schwer ist das eigentlich garnicht eine frage zu code zu stellen:
link, quellcode, sonst wird nur geraten.
Du willst den ganzen Quellcode sehn?
meinetwegen, ich dachte nur, dass keiner lust hat sich sowas komplett anzutun…
Ich erkläre nochmal eben, wozu ich das überhaupt mache. Mittels AJAX baue ich eine Verbindung zu der php-datei test.php auf, die ein JSON-Array mit Links, Interpreten, Titelnamen und Album zurückgibt wenn kein parameter in der URI übergebe. Die Daten kommen von einer Radiostation(Last.fm). Die Daten werden ausgewertet und sollen mit der Benennung INTERPRET - TITEL - ALBUM.mp3 gespeichert werden. Dazu wird ein Link auf die datei test.php mit einigen Parametern (u.a. Speichername) einem Frame zugewiesen. test.php erzeugt einen Octet-Stream der MP3-Datei. Dann wird ein Timeout gesetzt der den Zweiten Titel downloaden soll wenn der erste Tiel gesteamt wurde (nach der Laufzeit des Titels), wenn alle Titel einer Anfrage gedownloaded sind soll ein neuer Request gestartet werden. Es laufen im Beispiel unten 6 dieser Anfragen gleichzeitig.
function get(anz){
this.downloadanz = anz; //Anzahl der zeitgleichen Downloads
this.i = 0; //Nummer des Aktuellen Request
this.nr = 0; //Nummer des Aktuellen Request für widerchronologische Anfragem
this.download = new Array(this.downloadanz); //Jedes Array-Element enthält ein Array mit allen titeln eines Requests
this.img = new Array(this.downloadanz); //alle Link zu Standardcovern (126x126)
this.ignor = null; //Array mit allen zu ignorierenden Titeln
this.timeouts = new Array(); //ID sämmtlicher Timeouts
//Frames zum Donwload einhängen
var e,ee;
e=document.createElement("frameset");
e.border = 0;
e.framespacing = 0;
e.cols = 0;
e.id = "Frameset";
e.style.display = "display: none !important";
document.getElementsByTagName('html')[0].appendChild(e);
for(var u=0; u<this.downloadanz; u++){
e = document.createElement("frame");
e.frameborder = "0"
e.id = 'saveFrame'+u;
ee = document.createElement("frame");
ee.frameborder = "0"
ee.id = 'saveFrame'+u+"img";
document.getElementById('Frameset').appendChild(e);
document.getElementById('Frameset').appendChild(ee);
}
this.request = function (){
if(this.request.arguments.length<1){
if(this.i>=this.downloadanz)return false;
this.nr = this.i++;
}else{
this.nr = this.request.arguments[0];
this.download[this.nr]=0;
}
if(window.XMLHttpRequest){
http = new XMLHttpRequest();
}else if(window.ActiveXObject){
http = new ActiveXObject("Microsoft.XMLHTTP");
}
http.open('GET', 'test.php', true);
http.onreadystatechange = function(){
var response, i, e;
if(http.readyState==4){
try{
response = eval("(" + http.responseText + ")");//http.responseText ist ein JSON-Array mit folgendem Aufbau: array['Eigenschaft'][nr]
}catch(e){}
get.download[get.nr] = new Array();
get.img[get.nr] = new Array();
http = null;
if(!response)get.request(get.nr);//Falls kein Ergebnis zurückgegeben wurde oder dies Fehlerhaft war, wird es erneut versucht
if(typeof(response)=='object'){
if(typeof(get.download[this.nr])!='object')get.download[this.nr]=new Array();
for(i=0; i<response['title'].length; i++){
if(response['title'][i]=='' || response['creator'][i]==''){
continue;
}else{
saveas=(response['album'][i]=='')?response['creator'][i]+' - '+response['title'][i]+'.mp3':
response['creator'][i]+' - '+response['title'][i]+' - '+response['album'][i]+'.mp3';
}
//Daten in Array speichern
get.download[get.nr].push([response['location'][i], saveas, response['duration'][i]]);
get.img[get.nr].push([response['image'][i], response['creator'][i]+' - '+response['album'][i]+response['image'][i].substr(response['image'][i].lastIndexOf('.'))]);
}
get.load(get.nr);
get.request();
}
}
return true;
}
http.send(null);
return true;
}
this.load = function(requestNr){
var title, img;
if(this.download[requestNr].length==0){
this.request(requestNr);
return false;
}
title = this.download[requestNr].pop();
img = this.img[requestNr].pop();
this.timeouts.push(setTimeout('get.load('+requestNr+')', (1000*title[2])));
document.getElementById("saveFrame"+requestNr+"img").src="test.php?mode=save&link="+img[0]+"&saveas="+img[1];
document.getElementById("saveFrame"+requestNr).src="test.php?mode=save&link="+title[0]+"&saveas="+title[1];
}
this.stop = function(){
for(var i=0; i<this.timeouts.length; i++)
clearTimeout(this.timeouts[i]);
return true;
}
this.request();
}
var get=new get(6);
naja, der code ist wichtig, um eventuelle fehler finden zu können, sonst ist das ein fall für die glaskugel :?
meine js kenntnisse sind ein wenig eingerostet, aber es geht um den namen des frames. wenn immer der selbe name verwendet wird, wird ein download eben abgebrochen und ein refresh des bestehenden frames verursacht.
du könntest zum testen erst mal den eintrag:
e.style.display = "display: none !important";
auf leer setzen, dann sollten die frames nicht mehr unsichtbar sein und du solltest sehen, ob wirklich 6 frames geöffnet werden.
den genauen fehler habe ich ad hoc nicht gefunden, aber es klingt für mich nach obigem problem, dass ein refresh des aktuellen frames passiert.
ps.
war das ein bilder download ?
sie haben alle einen anderen Namen und werden auch korrekt eingebunden. Wenn ich das Ganze mit firebug beobachte wird auch nur dem Frame ein Link zugewiesen dem er auch zugewiesen werden soll, sprich die Frames deren downloads abgebrochen werden, werden nicht verändert. Daran wirds also wohl nicht liegen.
und ja es werden auch u.a Album-Cover heruntergeladen.