在 React Native 中从 arraybuffer 中获取 PDF

Get PDF out of arraybuffer in React Native

我服务器上的 websocket 向我的 react-native 应用程序发送一个 PDF 数组缓冲区,然后我试图从那里弄清楚如何显示 PDF。我觉得 rn-fetch-blob 会是答案,但我不确定去哪里。在浏览器上,我只是这样做了:

const pdfBlob = new Blob([e.data], {type: "application/pdf"})
const url = URL.createObjectURL(pdfBlob);
pdfViewer.setAttribute("src", url)

但是 React Native 不支持那样制作 Blob。我的下一次尝试是做这样的事情:

fetch(e.data, {
  responseType: "arraybuffer"
})
  .then(res => res.arrayBuffer())
  .then(res => res.blob())
  .then(pdfBlob => {
    const url = URL.createObjectURL(pdfBlob);
    /** ... */
  })
  .catch(e => console.error(e));

但这也没有用。我知道 当服务器的响应是一个 blob 时,它可以用于图像,但我不知道它是否是同一回事。

我对 arraybuffers、blob、fetching 等仍然非常敏感,所以非常感谢任何帮助。

嗯,这是很久以前的事了,所以我不太确定我自己的代码,或者它是否已经过时了。我记得读过一些关于 RNFetchBlob 对于较新版本的 React 是不必要的,但我是这样做的:

import RNFetchBlob from "rn-fetch-blob";
const { fs } = RNFetchBlob;

connection.onmessage = e => {
  if (typeof e.data === "string") {
    /* not array buffer */
  } else if (e.data.constructor === ArrayBuffer) {
    const base64 = binaryToBase64(e.data);
    const filePath = `${fs.dirs.CacheDir}/${shortid.generate()}.pdf`;

    RNFetchBlob.fs.createFile(filePath, base64, "base64").then(path => {
      // necessary ?
      RNFetchBlob.session("all").add(path);
    });
  }
};

我想我添加了 session 的路径,这样我可以稍后通过它们的会话 ID 批量删除 pdf。否则,我认为使用该路径您可以像这样将其传递到 PDF 组件中:

<Pdf source={{ uri: path, cache: false }} />