Mon code javascript effectue la requête AJAX suivante sur mon serveur node.js:
var url = '/node/download'; var downloadRequest = new goog.net.XhrIo(); downloadRequest.headers.set('content-type', 'application/json'); downloadRequest.send(url);
Mon serveur node.js crée un pdf au nœud et transmet le pdf au client via le code suivant:
var filestream = fs.createReadStream(pdfpath); res.writeHead(200, { 'Content-disposition': 'attachment; filename=' + filename, "Content-Type":"application/pdf","Content-Transfer-Encoding": "binary"}); filestream.on('data', function(chunk) { res.write(chunk); }); filestream.on('end', function() { res.end(); });
Mais maintenant, j'ai du mal à savoir comment recevoir cette réponse sur le client javascript afin qu'une invite de téléchargement s'ouvre pour permettre à l'utilisateur de télécharger et d'enregistrer le fichier pdf.
Aidez-nous!
Thanx à l'avance!
PS Plz suggère également une meilleure façon de mettre en œuvre le code de mon noeud (le cas échéant)
Edit: Une solution possible serait d'envoyer ma demande comme ceci:
window.location.assign('/node/download');
De cette façon, je reçois l'invite de téléchargement et tout fonctionne bien, sauf que la nature asynchrone du produit est sacrifiée. Y a-t-il un travail pour que je puisse conserver l'asynchronicité?
Pour télécharger un fichier PDF enregistré sur le serveur
Faites la demande comme ceci à partir du client javascript:
var reqObj = new XMLHttpRequest(); reqObj.open('GET','getpdf',true); // 'getpdf' is the URI to recongize your request at the server reqObj.send(); reqObj.onreadystatechange = function() { var resObj = this; if(resObj.readyState == resObj.DONE) { if (resObj.status != 200) { console.log("pdf can't be downloaded"); } else if (resObj.status == 200){ var resTxt = reqObj.responseText; window.location.assign(resTxt); // Opens the pdf download prompt } } }
Sur le nœud, suivez la requête reçue par le haut et répondez:
var http = require('http'); function getPDFUrl() { return "http://testing.com/pdf/test.pdf"; } var handler = http.createServer(function(request, response) { if (request.url == 'getpdf' && request.method.toLowerCase() == 'get') { var pdfUrl = getPDFUrl(); //get pdf url here if (pdfUrl != null && pdfUrl != undefined && pdfUrl != '') { response.writeHead(200, {"Content-Type":"text/html"}); response.write(pdfUrl); response.end(); } else { response.writeHead(404, {"Content-Type":"text/html"}); response.write("Not Found"); response.end(); } } });
J'implique des fonctionnalités similaires de génération de fichiers asynchrones dans certaines applications. L'approche que je prends est un peu plus impliquée, mais garde votre interface asynchrone.
Ceci est invisible pour l'utilisateur, il faudra attendre que la deuxième transaction revienne.