我有一个提供pdf文件的节点应用程序(特别是sails app)。我的服务文件代码如下所示。
request.get(pdfUrl).pipe(res)
当我查看pdf的网址时,它会将pdf设为正常。但有时,它只是在浏览器上呈现pdf的二进制数据,如下所示。
%PDF-1.4 1 0 obj << /Title (��) /Creator (��wkhtmltopdf
我无法弄清楚为什么它无法正确地随机提供pdf。它是镀铬的东西吗?或者我错过了什么?
答案 0 :(得分:2)
将此留在这里,希望它能帮助某些人 - 我多次遇到过类似问题,而且有两件事情:
:443
之外,您还必须指定wss
。request
的编码参数用于提供纯文本而不是对象。这可以通过将encoding
设置为null来完成,如下所示:request({url: myUrl, encoding: null})
。由于(2),我很确定你正面临着这个问题。看看https://github.com/request/request
encoding - 要在响应数据的setEncoding上使用的编码。如果 null,body作为Buffer返回。别的什么(包括 默认值undefined)将作为encoding参数传递 to toString()(意思是默认情况下这实际上是utf8)。 (注意:如果 你期望二进制数据,你应该设置encoding:null。)
由于上述建议对您不起作用,希望看到以下取证:
答案 1 :(得分:1)
您可能需要在节点响应中包含内容类型标题{{1}},以告知收件人他们收到的内容是PDF。有些浏览器足够智能,可以从数据流中确定内容类型,但你不能认为总是如此。
答案 2 :(得分:1)
当Chrome将PDF作为文本下载时,我会检查文件的最后部分。 PDF文件最后包含强制性xref
表。因此每个有效的PDF文件应以以下顺序结束:%EOF
。如果没有,则请求被中断或出现问题。
答案 3 :(得分:0)
您还需要HTTP标头:
Content-Disposition:inline; filename=sample.pdf;
并且
Content-Length: 200
您是否尝试将所有二进制内容保存在磁盘上并通过PDF阅读器手动打开?它可能是腐败的。
答案 4 :(得分:0)
我建议尝试这两种方法:
Content-Type: application/pdf
Content-Disposition: attachment; filename="somefilename.pdf"
(或以其他方式控制Mime类型:https://www.npmjs.com/package/mime-types)