【问题标题】:Laravel 5.2 - How to return a PDF as part of a JSON responseLaravel 5.2 - 如何将 PDF 作为 JSON 响应的一部分返回
【发布时间】:2016-07-12 03:30:36
【问题描述】:

所以我开发了一个 API,其中一个端点是报告生成器。通常他们会发送报告的名称和其他一些变量,然后它会使用Laravel-Snappy 弹出一个 PDF。

我也在使用JWT-Auth 进行身份验证。由于我需要符合 HIPAA 标准,因此我将在每次通话时刷新令牌。对于大多数端点来说,这很容易,因为我只是将它添加到我的 json 响应的元数据中。

但是,对于报告,他们只返回带有标题的 PDF 以强制下载等。我有没有办法将 PDF 数据作为 JSON 响应的一部分发送,应用程序可以使用此 API?我是否可能需要以某种方式对其进行加密,以便它可以与 json 响应一起发送?任何思路的任何其他想法都将不胜感激。

【问题讨论】:

  • 您是否尝试过使用file_get_content 并将内容作为json 的一部分发送?

标签: php json laravel pdf


【解决方案1】:

不必亲自执行此操作,但我在 API 中看到的方式是读取文件内容、base64 编码并在 json 响应中提供。

快速的代码

$pdf = base64_encode(file_get_contents('path/to/my.pdf'));

return response()->json([
    'pdf' => $pdf,
]);

然后用户可以这样消费它。

$pdf = base64_decode($json->pdf);

file_put_contents('path/to/save/my.pdf', $pdf);

然后您应该能够正常打开/读取保存的文件。

【讨论】:

  • 非常感谢。我会尝试一下,如果可行,我会将其标记为答案
  • 我已将其付诸实施,并且有效。我不得不在 angularjs 方面进行一些调整,以使其使用 json 响应中的数据,但这并没有花费很长时间。响应时间总共增加了 0.3 秒
【解决方案2】:

我认为发送大型二进制数据作为 JSON 响应的一部分并不是最好的主意。我宁愿为具有 uuid 或更有意义的 id 的 PDF 文件创建临时 GET URI,并将其呈现在实际的 JSON 响应中。 API 使用者将能够读取响应并下载文件。

【讨论】:

  • 我们已经考虑过这一点,但我们将处于 SaaS 环境中并且需要符合 HIPAA 标准,这意味着即使文件仅可用几秒钟,它们仍然可用并进行检查以使确保正确的人/客户正在访问这个临时文件更令人头疼,然后将二进制数据添加到 json 响应中的额外几秒钟将创建。
  • 您可以在文件的访问 URL 中生成无法猜测的随机字符串,并将该 URL 指定为 API 响应。这样该文件将无法在外部访问。
  • 老实说,工作量太大,无法避免几秒钟。这是个好主意,只是不是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
相关资源
最近更新 更多