Comment télécharger un fichier pdf via javascript?

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.

  • Le client envoie une demande pour le fichier à générer.
  • Le serveur envoie une réponse avec l'URL du fichier généré.
  • Client effectue une seconde demande pour télécharger le fichier généré.

Ceci est invisible pour l'utilisateur, il faudra attendre que la deuxième transaction revienne.