从节点服务器流式传输pdf文件只是在浏览器上显示二进制数据

时间:2016-05-11 21:23:27

标签: node.js pdf express sails.js

我有一个提供pdf文件的节点应用程序(特别是sails app)。我的服务文件代码如下所示。

request.get(pdfUrl).pipe(res)

当我查看pdf的网址时,它会将pdf设为正常。但有时,它只是在浏览器上呈现pdf的二进制数据,如下所示。

%PDF-1.4 1 0 obj << /Title (��) /Creator (��wkhtmltopdf

我无法弄清楚为什么它无法正确地随机提供pdf。它是镀铬的东西吗?或者我错过了什么?

5 个答案:

答案 0 :(得分:2)

将此留在这里,希望它能帮助某些人 - 我多次遇到过类似问题,而且有两件事情:

  1. 您正在使用HTTP连接进行HTTPS传送(这对于websockets而言很常见,除了:443之外,您还必须指定wss
  2. request的编码参数用于提供纯文本而不是对象。这可以通过将encoding设置为null来完成,如下所示:request({url: myUrl, encoding: null})
  3. 标题中的内容类型 - 转向清除这一点,因为它很明显/其他人已经基本上覆盖了这一点:)
  4. 由于(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