【问题标题】:Loading buffer data from database as PDF以 PDF 格式从数据库加载缓冲区数据
【发布时间】:2020-11-22 02:52:34
【问题描述】:

我一直在开发一个网络应用程序,用户可以在其中上传 PDF 文件,然后检索它并查看它。我一直在做的就是将 PDF 作为 bytea 数据类型上传到 PostgreSQL 数据库(该列称为“附件”),然后让 nodeJS 提供这些数据以取回并转换回 PDF 以查看.

但是,我一直在努力将数据转换回有效的 PDF。这是我目前使用的方法。

var file = new Blob([res[i].attachment], { type: 'application/pdf' });
var fileURL = URL.createObjectURL(file);
document.getElementById("pdf_box").data = fileURL;

#pdf_box 标识符是指 HTML 文件中用于显示 PDF 的对象元素(当我将虚拟 PDF 文件的文件位置提供给该元素的数据属性时,这已显示有效)。

res[i].attachment 还显示以 JSON 格式提供有效的缓冲区数据,示例如下:

"attachment":{"type":"Buffer","data":[91,111,98,106,101,99,116,32,70,105,108,101,93]}

但是,当我将创建的 fileURL 加载到 #pdf_box 的 data 属性中时,我收到一条错误消息,表明 PDF 文件无效。到目前为止,我的研究似乎表明这可能是因为数据是以缓冲区的形式进入的,而它需要以字节的形式出现,但我没有发现太多可以帮助我了解如何实现这一点的方法,或者是否有办法在表格与我可以访问的数据之间进行转换?我还看到偶尔引用一个名为 pdf.create() 的方法,但我找不到这方面的文档,我认为它必须属于 JS 的第三方库。

如果您知道任何可以帮助我了解我的问题是什么以及搜索什么以找出解决方案的信息,我们将不胜感激,谢谢。

【问题讨论】:

  • 通常你不会将文件内容保存到数据库中(我可以上传 100 x 100Mb 的文件,你的数据库容量会大大减少)。您将文件上传到某个存储位置:CDN、AWS S3、保存在服务器上等。在数据库中,您只保存资源的 URL。在 UI 部分,您使用一些 PDF 查看器来显示来自 URL 的元素
  • 此外,使用<object id="pdf" data="../files/test.pdf" type="application/pdf"></object> 似乎是我发现在您的应用程序中显示 PDF 而无需打开文件的最有效的本地方式。要动态调整它,您可以修改数据属性,例如document.getElementById("pdf").data = '../files/test2.pdf'

标签: javascript html node.js pdf


【解决方案1】:

对于所有阅读此问题的人来说,这种方法似乎是不可能的,而且实施起来可能效率极低。如果您向 nodeJS 发送的字符串大于与此服务器的链接的 MTU(介于 68 字节和 >1500 字节之间,具体取决于网络的每个组件),则数据包将被静默丢弃,不会尝试解决或抛出错误。你必须做的是采用“multipart/form-data”编码的方法将任何文件发送到服务器(更多关于这个发现here)。

还应该提到的是,不建议以任何容量将文件上传到数据库(由于数据库对于大量数据的存储效率非常低),应该做的是上传文件路径的引用或查找文件的 URL。然后在客户端,当您检索到文件位置时,可以这样呈现此文件...

<object id="pdf" data="../files/test.pdf"></object>

要改变数据属性,可以做以下...

document.getElementById("pdf").data = "../files/test2.pdf";

【讨论】:

    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 2018-05-09
    相关资源
    最近更新 更多