在浏览器中使用express js显示PDF

app.post('/asset', function(request, response){ var tempFile="/home/applmgr/Desktop/123456.pdf"; fs.readFile(tempFile, function (err,data){ response.contentType("application/pdf"); response.send(data); }); }); 

我是expressie的新手,我无法用数据对象发送响应。 二进制内容在浏览器中可见。 给我build议如何处理这个?

我testing了你的代码,它在Chrome中对我有效,只需要改变一下:将app.post改为app.get

编辑:因为你似乎认为只POST服务器是一个好主意,请阅读: http : //net.tutsplus.com/tutorials/other/a-beginners-introduction-to-http-and-rest/向下滚动直到HTTP动词并查看GET和POST之间的区别。 🙂

一些快速的研究表明,其他浏览器可能有其他问题,例如IE可能期望URL以.pdf结尾。 由于我在我的Mac上,我无法为你testing;)

指定如何处理文件下载都归结为Content-disposition标头。 您也可以在这里指定文件的名称。 我们还设置Content-type来确保浏览器知道如何处理给定的文件。

Express.js示例:

 app.post('/url/to/hit', function(req, res, next) { var stream = fs.readStream('/location/of/pdf'); var filename = "WhateverFilenameYouWant.pdf"; // Be careful of special characters filename = encodeURIComponent(filename); // Ideally this should strip them res.setHeader('Content-disposition', 'inline; filename="' + filename + '"'); res.setHeader('Content-type', 'application/pdf'); stream.pipe(res); }); 

现在,如果仔细观察Content-disposition ,就会注意到inline; 字段是什么设置浏览器如何反应到文件。 如果你想强制下载,你可以通过设置inline; attachment;

我也发现(通过烧几次),如果你在你的文件名中设置特殊字符,它可以打破。 所以我encodeURIComponent()的文件名,以确保不会发生。

希望帮助别人试图弄清楚一样!

编辑

在我发布这个最初和现在之间的时间,我已经发现如何正确编码content-disposition的文件名参数。 根据规范,文件名应该是RFC5987编码。 我最终从MDN中find了一个正确处理编码的示例代码片段 ( encodeURIComponent()不是这个字段完全正确的格式)。

MDN片段

 var fileName = 'my file(2).txt'; var header = "Content-Disposition: attachment; filename*=UTF-8''" + encodeRFC5987ValueChars(fileName); console.log(header); // logs "Content-Disposition: attachment; filename*=UTF-8''my%20file%282%29.txt" function encodeRFC5987ValueChars (str) { return encodeURIComponent(str). // Note that although RFC3986 reserves "!", RFC5987 does not, // so we do not need to escape it replace(/['()]/g, escape). // ie, %27 %28 %29 replace(/\*/g, '%2A'). // The following are not required for percent-encoding per RFC5987, // so we can allow for a little better readability over the wire: |`^ replace(/%(?:7C|60|5E)/g, unescape); } 

另一个在这一个顶部的说明,浏览器也不完全符合规范。 一些字符仍然会从下载中错误地回来(至less在我testing的时候)。

你可以通过更新你的下载工作来解决这个问题。 如果您的下载URL以文件名结尾(并且您没有在标题中提供filename属性),则它将正确地从URL编码值中获取文件名。 'http://subdomain.domain-url.com/some/path/to/downloads/' + encodeURIComponent("You're there, download this!.pdf")

Jeeze,所有提供文件名到您的下载!

我的解决scheme直接发送PDF到浏览器:

 app.get('/my/pdf', function (req, res) { var doc = new Pdf(); doc.text("Hello World", 50, 50); doc.output( function(pdf) { res.type('application/pdf'); res.end(pdf, 'binary'); }); }); 

res.end()与第二个参数“二进制”在我的情况下做的伎俩。 否则将其解释为一个string

这与以下代码一样简单:

 var express = require('express'), fs = require('fs'), app = express(); app.get('/', function (req, res) { var filePath = "/files/my_pdf_file.pdf"; fs.readFile(__dirname + filePath , function (err,data){ res.contentType("application/pdf"); res.send(data); }); }); app.listen(3000, function(){ console.log('Listening on 3000'); }); 

完整的回购

克隆节点 – 作弊pdf_browser ,运行node app然后npm install express

快乐帮助!