使用 Node 服务器在 React App 中显示来自网络驱动器的动态 PDF

Posted

技术标签:

【中文标题】使用 Node 服务器在 React App 中显示来自网络驱动器的动态 PDF【英文标题】:Display dynamic PDF from network drive in React App with Node server 【发布时间】:2021-11-22 23:24:37 【问题描述】:

我无法在我的 React 应用程序中显示位于网络驱动器上的 pdf 文件。

首先,我尝试将iFrame的source属性直接设置为pdf所在的路径。尝试这个,我得到一个错误,由于安全原因,chrome不会加载本地资源。

经过一番研究,我尝试在节点服务器上获取文件并将其发送给客户端。这就是我现在卡住的地方。

我在服务器端的部分代码:

function getTestDoc(req, res, next) 

  var file = fs.createReadStream("R:\Test.pdf")
  res.contentType("application/pdf");
  res.sendFile(file);


我在客户端的部分代码:

function getTestDoc() 
  const requestOptions = 
    method: 'GET',
    responseType: "blob",
    headers: authHeader(),
  ;

  return fetch(`$apiUrl/mo/gettestdoc`, requestOptions)
  .then((response) => 
    const file = new Blob([response.body], type: "application/pdf")
    const fileUrl = URL.createObjectURL(file)

    window.open(fileUrl))

当新窗口打开时,出现错误提示“加载 PDF 文档时出错。”。

我做错了什么?我很感谢任何建议。

PS:服务器和客户端之间的一般连接是正常的。

【问题讨论】:

【参考方案1】:

我终于找到了答案。

服务器端代码:

filePath = "\\\\servername\\path\\Test.pdf"
var file = fs.createReadStream(filePath)
var stat = fs.statSync(filePath);
res.setHeader('Content-Length', stat.size);
res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Disposition', 'inline; filename=Test.pdf');
file.pipe(res);

客户端代码:

return fetch(`$apiUrl/mo/gettestdoc`, requestOptions)
  .then((response) => 
    response.blob()
    .then(blob => 
      const fileUrl = URL.createObjectURL(blob)
      window.open(fileUrl);
    )
)

【讨论】:

以上是关于使用 Node 服务器在 React App 中显示来自网络驱动器的动态 PDF的主要内容,如果未能解决你的问题,请参考以下文章

使用 node express 的 create-react-app 获取 %PUBLIC_URL%

Node.js - 在终端中显示 ESLint 错误,如 create-react-app

react_app 项目开发 _后台服务器端-node

我可以使用带有 create-react-app 的自定义 node_modules 路径吗

如何从 create-react-app 测试中排除 node_modules?

使用 create-react-app 和 node 设置 jest 多项目