亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 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 關注
  • 256 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號