为了账号安全,请及时绑定邮箱和手机立即绑定

从 api 响应获取 pdf 文件

从 api 响应获取 pdf 文件

摇曳的蔷薇 2023-08-05 21:06:34
我正在调用 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 响应时,它工作正常。我发现了类似的问题,但没有一个解决方案对我有用。如果有人能指出这个问题那就太好了。
查看完整描述

4 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

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


fetch(`api` + guid, {

   method: "GET",

   headers: {

    "Accept": "application/octet-stream",

    "Authorization": "Bearer " + token,

   },

   // responseType: 'arraybuffer' //#1 remove this,

})

相反,响应本身可以作为数组缓冲区传递,如下所示。


.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");

})

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


查看完整回答
反对 回复 2023-08-05
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

    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;

                    })


查看完整回答
反对 回复 2023-08-05
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

这是对我有用的示例:


async createPdf(context, data) {

    let url = new URL(baseURL + '/invoice/createPdf');

    url.search = new URLSearchParams({

        id: data

    })


    await fetch(url, {

        method: 'GET',

        headers: {

            'Authorization': "Bearer " + localStorage.getItem("jwt"),

            'Accept': 'application/octet-stream'

        },

    }).then((res) => res.arrayBuffer())

        .then(data => {

            var base64Str = Buffer.from(data).toString('base64');


            var binaryString = window.atob(base64Str);

            var binaryLen = binaryString.length;

            var bytes = new Uint8Array(binaryLen);

            for (var i = 0; i < binaryLen; i++) {

                var ascii = binaryString.charCodeAt(i);

                bytes[i] = ascii;

            }

            var arrBuffer = bytes;


            var newBlob = new Blob([arrBuffer], { type: "application/pdf" });


            if (window.navigator && window.navigator.msSaveOrOpenBlob) {

                window.navigator.msSaveOrOpenBlob(newBlob);

                return;

            }


            data = window.URL.createObjectURL(newBlob);


            var link = document.createElement('a');

            document.body.appendChild(link);

            link.href = data;

            link.download = "Faktura.pdf";

            link.click();

            window.URL.revokeObjectURL(data);

            link.remove();

        })


查看完整回答
反对 回复 2023-08-05
?
www说

TA贡献1775条经验 获得超8个赞

就我而言,响应与您的相同,我正在尝试将其转换为 pdf 文件,以便我可以在 UI 上预览它。


为此,我需要获取响应中已存在的 blob 类型的 URL...以获取我所做的 URLURL.createObjectURL(myblob)


const [url,seturl] = useState('');

response

  .then((resp) => resp.blob())

  .then((myBlob) => {

    seturl(URL.createObjectURL(myBlob)); //<-- use this for fetching url from your response

    console.log(myBlob);

  })

  .catch((err) => {

    console.log(err.message());

  });


查看完整回答
反对 回复 2023-08-05
  • 4 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信