Hallo allemaal,

sinds kort ben ik bezig met het fenomeen 'AJAX'. Dit omdat ik een systeempje wilde maken om mijn bestanden (beschikbaar via de FTP van mijn thuisserver) overal ter wereld beschikbaar wilde stellen (enkel voor mezelf natuurlijk).

Alles gaat goed. De FTP class werkt perfect, AJAX doet het... op één klein dingetje na. Het is mogelijk om bestanden via de FTP te downloaden (ftp_get()). Dit werkt perfect als ik het php-script aanroep via de browser, maar als ik dit doe dmv AJAX dan wacht AJAX niet tot het script volledig is voltooid.

In het kort:

AJAX aanroepen -> FTP-download van thuisserver naar webserver via ftp_get() -> AJAX opent bestand -> Gebruiker kan bestand downloaden.

Ik maak gebruik van prototype.js, maar de OnComplete-functie doet het niet echt, of hij wacht niet tot het bestand volledig is gedownload van mijn thuisserver. Weet iemand misschien een oplossing zodat het bestand eerst volledig is gedownload alvorens het te presenteren aan de gebruiker?

AJAX:

function file_download(file, folder)
{
    new Ajax.Request('layout/file-download.php', {
        method: 'get',
        parameters: { file: file, folder: folder },
        onSuccess: setTimeout(window.location = "temp/"+file.substr(folder.length + 1), 5000)
    });
}
Mischien iets met setTimeout?
Nja, die heb ik er maar tussengestoken om het nog een vijftal secondjes uit te stellen. Bij bestanden groter dan 2MB geeft hij dan gewoon 'bestand niet gevonden' omdat het PHP-bestandje nog niet klaar is met downloaden van de server.

Op één of andere manier zou ik een FTP-stream moeten kunnen maken.
Ik ben geen expert in AJAX, maar jouw probleem komt me wel bekend voor. Als het goed is heeft het te maken heeft met de eerst A in AJAX; asynchroon. Ik neem aan dat je weet wat dat woord betekend als je AJAX gebruikt. Doordat er een bestand aan het binnenkomen is 'weet' prototype/javascript dat er een succesvol antwoord is en gaat dus verder met de onSuccess. Die voert meteen de window.location uit.

Probeer het eens door "asynchronous: false" toe te voegen aan de parameterlijst.
Volgens mij moet het niet aan de parameterlijst worden toegevoegd, maar gewoon losjes eronder.


function file_download(file, folder)
{
    new Ajax.Request('layout/file-download.php', {
        method: 'get',
        parameters: { file: file, folder: folder },
        asynchronous: false,
        evalScripts: true,
        onComplete: setTimeout(window.location = "temp/"+file.substr(folder.length + 1), 5000)
    });
}


Dit is wat ik nu heb, maar hij wilt het maar niet doen. Firebug geeft trouwens een fout in prototype.js...

Eventjes verder Googlen. Hulp is nog steeds welkom.
Oh ja dat bedoelde ik idd, parameters van Ajax.Request, maar de heeft weer een parameter parameters :P Maar dan heb ik verder ook geen idee helaas. Ben wel benieuwd naar je uiteindelijke oplossing.
Ghehe, je roept setTimeout al aan bij het definieren van je request. Het resultaat (de identifier) sla je vervolgens op in onComplete.

Oplossing:

onComplete: function() {
    setTimeout(window.location = "temp/"+file.substr(folder.length + 1), 5000);
}
Jawel !

@ Dutchcamel: hij deed het enkel niet in Firefox. Opera en IE deden het perfect.

@ Jelmer: dat was het 'kleine' foutje dat Firefox in de weg stond :-) !

Hartelijk bedankt allebei !

Reageren