如何通过JavaScript下载PDF文件?

我的JavaScript代码向我的node.js服务器发出以下AJAX请求:

var url = '/node/download'; var downloadRequest = new goog.net.XhrIo(); downloadRequest.headers.set('content-type', 'application/json'); downloadRequest.send(url); 

我的node.js服务器在节点上创build一个pdf,并通过下面的代码将pdf传回客户端:

  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(); }); 

但是现在我在如何在javascript客户端接收这个响应时遇到了麻烦,所以下载提示会打开,允许用户下载并保存pdf文件。

请帮忙!

感谢提前!

PS Plz也build议任何更好的方法来实现我的节点的代码(如果有的话)

编辑:一个可能的解决办法是发送我的要求是这样的:

 window.location.assign('/node/download'); 

这样我得到下载提示,一切正常,除了牺牲了产品的asynchronous性质。 有没有解决这个问题,这样我还可以保持asynchronous?

用于下载保存在服务器上的pdf文件

从客户端请求这样的请求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 } } } 

在节点处理从上面收到的请求并响应:

 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(); } } }); 

我在一些应用程序中实现了类似的asynchronous文件生成function。 我采取的方法是多一点参与,但保持你的界面asynchronous。

  • 客户端发送一个要生成的文件的请求。
  • 服务器使用生成的文件的URL发送响应。
  • 客户端再次请求下载生成的文件。

这对用户是不可见的,他们只需要等待第二个事务回来。