从 api 响应获取 pdf 文件

新手上路,请多包涵

我正在调用一个 api 并获得 pdf 作为回报。

 fetch(`api` + guid, {
   method: "GET",
   headers: {
    "Accept": "application/octet-stream",
    "Authorization": "Bearer " + token,
   },
   responseType: 'arraybuffer',
})
.then((res) => res.text())
.then((data) => {
    fs.writeFileSync('file.pdf', data);
});

我得到了 pdf 文件,但问题是 pdf 文件始终为空。但是当我接受响应作为 json 时,它工作正常。

我发现了类似的问题,但没有一个解决方案对我有用。

如果有人能指出这个问题,那就太好了。

原文由 Yogesh Bhattarai 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 569
2 个回答

我发现了问题。因为我使用的是 fetch 而不是 Axios。我们不能将 responseType 作为 Fetch 的选项传递。

 fetch(`api` + guid, {
   method: "GET",
   headers: {
    "Accept": "application/octet-stream",
    "Authorization": "Bearer " + token,
   },
   // responseType: 'arraybuffer' //#1 remove this,
})

相反,响应本身可以作为 arraybuffer 传递,如下所示。

 .then((res) => res.arraybuffer())

代替

.then((res) => res.text())

现在不是直接使用响应来编写我们的 pdf 文件。我们可以将数据更改为 base64 字符串并再次解码以创建我们的 pdf 文件。我使用 base64ToPdf npm 包来处理它。

 .then(data => {
  var base64Str = Buffer.from(data).toString('base64');
  base64.base64Decode(base64Str, "file.pdf");
})

我希望这对其他人有帮助。 :)

原文由 Yogesh Bhattarai 发布,翻译遵循 CC BY-SA 4.0 许可协议

    Change res.arraybuffer() to  res.arrayBuffer()

Below is the working code with webdriverio-

  var headers = {
            Authorization: "Bearer " + accessToken,
            Accept: 'application/pdf'
        }

           fetch(
                apiurl,
                {
                    headers: {
                        Accept: "application/octet-stream",
                        Authorization: "Bearer " + accessToken
                    },
                },
            )
                .then((res) => {
                    if (!res.ok) {
                        return res.status.toString()
                    }
                    return res.arrayBuffer()
                })
                .then((data) => {
                    var base64Str = Buffer.from(data).toString('base64');
                    base64.base64Decode(base64Str, filename);
                })
                .catch(
                    (err) => {
                        return err.Message;
                    })


原文由 vishal srivastava 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题