【问题标题】:Node.js: serving dynamic pdf, coming up emptyNode.js:提供动态 pdf,空出来
【发布时间】:2012-08-31 01:32:26
【问题描述】:

我有一个节点服务,它从 API 获取 pdf 并提供该 pdf。

当我 curl 或直接打开 API 时,我确实看到了正确的 pdf。

但是当我从我的 Node 应用程序中提供它时,我得到一个空的 pdf。

这是我的代码中执行 pdf 渲染的部分。

} else if (options.type === 'pdf') {
  res.writeHead(200, {'content-type' : 'application/pdf', 'content-disposition': 'attachment; filename=invoice.pdf'});
  res.end(data.invoice);

我已经 console.log'ed data.invoice 知道这是正确的东西。

typeof(data.invoice) 给出字符串;但我也尝试过 res.end(new Buffer(data.invoice));这也不起作用。

这是我获取数据的代码部分

var http_options = {
  method : options.method
, host : Config.API.host
, path : options.path
, port : Config.API.port
, headers : options.headers
};

var req = http.request(http_options, function (response) {
  var raw_response = "";

  response.on('data', function (response_data) {
    raw_response += response_data.toString();
  });

  response.on('end', function () {
    if (response.statusCode !== 200) {
      cb(raw_response);
    } else {
      cb(false, raw_response);
    }
  });
});

req.setTimeout(timeout, function () {
  req.abort();
  cb("API connection timed out");
});

req.on('error', function (error) {
  cb("API error while requesting for " + options.path + '\n' + error + '\n' + "http   options: " + JSON.stringify(http_options)
});

req.end();

【问题讨论】:

  • 您是否尝试过将Content-Type 大写?因为你写了小写的“c”和“t”

标签: node.js pdf download


【解决方案1】:

您收到 PDF 时的toString() 和连接很可能会损坏它。尝试将raw_response 写入文件(您可以使用writeFileSync(),因为这只是一次性测试)并与使用 curl 检索到的相同 PDF 进行逐字节比较。

请注意,如果字符串转换过程损坏了它,那么在发送之前尝试将其转换回缓冲区将无济于事。您必须从头到尾将整个事情作为缓冲区。

【讨论】:

  • 有没有办法在不写入文件的情况下连接缓冲区?
  • 我正在尝试 Buffer.concat 但现在我在下载后尝试打开它时遇到“损坏”的 pdf,有什么想法吗?
  • @Max 什么解决了这个问题?我也面临同样的问题,文件的页数相同,但所有页面都是空的。
【解决方案2】:

由于您不打算在传输过程中修改或读取这些数据,我建议只使用pipe 函数将来自response 的所有数据通过管道传输到reqthis question has a good sample,但这里是摘录。

req.on('response', function (proxy_response) {
    proxy_response.pipe(response);
    response.writeHead(proxy_response.statusCode, proxy_response.headers);
});

请注意,没有理由将来自缓冲区的响应中的块转换为其他内容,只需将它们作为未修改的缓冲区写入,然后流式传输它们(这是管道将为您做的)而不是累积它们来获取最高效率(和 node.js 流媒体时髦点)。

【讨论】:

  • 虽然我很乐意这样做;让它适应现有架构需要一些工作......也许我会在它成为瓶颈时尝试一下
猜你喜欢
  • 2015-08-07
  • 2014-05-18
  • 1970-01-01
  • 2020-05-12
  • 2016-08-24
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多