vue如何將base64流數(shù)據(jù)轉(zhuǎn)成pdf文件并在新頁(yè)面打開
將base64流數(shù)據(jù)轉(zhuǎn)成pdf文件并在新頁(yè)面打開
參考了很多寫法,最終這種方法可以實(shí)現(xiàn)。
具體實(shí)現(xiàn)方法:
將下面這兩個(gè)方法寫在vue中,直接調(diào)用viewPdf函數(shù),傳參為要轉(zhuǎn)換的base64流數(shù)據(jù)
viewPdf(content) { if (!content) { this.$message.error('暫無意見') return } const blob = this.base64ToBlob(content) if (window.navigator && window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(blob) } else { const fileURL = URL.createObjectURL(blob) window.open(fileURL) } }, base64ToBlob(code) { code = code.replace(/[\n\r]/g, '') // atob() 方法用于解碼使用 base-64 編碼的字符串。 const raw = window.atob(code) const rawLength = raw.length const uInt8Array = new Uint8Array(rawLength) for (let i = 0; i < rawLength; ++i) { uInt8Array[i] = raw.charCodeAt(i) } return new Blob([uInt8Array], { type: 'application/pdf' }) },
base64轉(zhuǎn)二進(jìn)制文件流并顯示
1.判斷base類型 這里提供圖片和pdf
function base64FileHeaderMapper(fileBase64) { let fileHeader = new Map(); //獲取不同文件的文件頭前3個(gè)字作為判斷依據(jù) fileHeader.set("/9j", "jpeg"); fileHeader.set("iVB", "png"); // fileHeader.set("Qk0", "BMP") // fileHeader.set("SUk", "TIFF") fileHeader.set("JVB", "pdf"); // fileHeader.set("UEs", "OFD") let res = ""; //遍歷map中所提及的文件頭特征 fileHeader.forEach((v, k) => {//IE不支持箭頭函數(shù) 兼容IE需要改寫 if (k == fileBase64.substr(0, 3)) { res = v; } }); //如果不在map中返回unknown file if (res == "") { res = "unknown file"; } //否則返回map中的value值 return res; }
2.base轉(zhuǎn)二進(jìn)制文件流
function base64ToBlob(code, type) { code = code.replace(/[\n\r]/g, ""); let raw = window.atob(code); let rawLength = raw.length; let uint8Array = new Uint8Array(rawLength); for (let i = 0; i < rawLength; i++) { uint8Array[i] = raw.charCodeAt(i); } if ("pdf" === type) { return new Blob([uint8Array], { type: "application/pdf" }); } else { return new Blob([uint8Array], { type: "image/jpeg" }); } }
3.填坑
base64
字符串中不含 data:application/pdf;base64,
否則 window.atob(code);
解碼報(bào)錯(cuò),不解碼也無法加載pdf
4.完整代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>base轉(zhuǎn)二進(jìn)制</title> </head> <body> <div style="width: 100vw;height: 100vh"> <iframe width="100%" height="100%" src="" frameborder="0" id="iframe"></iframe> </div> <script> let iframe = document.getElementById("iframe") let base = "JVBERi0xLjQKJdPr6eEKMSAwIG9iago8PC9DcmVhdG9yIChNb3ppbGxhLzUuMC..."; //base64不完整 let s = base64FileHeaderMapper(base); let blob = base64ToBlob(base, s); iframe.src = URL.createObjectURL(blob); function base64FileHeaderMapper(fileBase64) { let fileHeader = new Map(); //獲取不同文件的文件頭前3個(gè)字作為判斷依據(jù) fileHeader.set("/9j", "jpeg"); fileHeader.set("iVB", "png"); // fileHeader.set("Qk0", "BMP") // fileHeader.set("SUk", "TIFF") fileHeader.set("JVB", "pdf"); // fileHeader.set("UEs", "OFD") let res = ""; //遍歷map中所提及的文件頭特征 fileHeader.forEach((v, k) => {//箭頭函數(shù)IE不支持 兼容IE需改寫 if (k == fileBase64.substr(0, 3)) { res = v; } }); //如果不在map中返回unknown file if (res == "") { res = "unknown file"; } //否則返回map中的value值 return res; } function base64ToBlob(code, type) { code = code.replace(/[\n\r]/g, ""); let raw = window.atob(code); let rawLength = raw.length; let uint8Array = new Uint8Array(rawLength); for (let i = 0; i < rawLength; i++) { uint8Array[i] = raw.charCodeAt(i); } if ("pdf" === type) { return new Blob([uint8Array], { type: "application/pdf" }); } else { return new Blob([uint8Array], { type: "image/jpeg" }); } } </script> </body> </html>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue3系統(tǒng)進(jìn)入頁(yè)面前的權(quán)限判斷和重定向方式
這篇文章主要介紹了vue3系統(tǒng)進(jìn)入頁(yè)面前的權(quán)限判斷和重定向方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03開發(fā)一個(gè)Parcel-vue腳手架工具(詳細(xì)步驟)
這篇文章主要介紹了開發(fā)一個(gè)Parcel-vue腳手架工具(詳細(xì)步驟),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09最細(xì)致的vue.js基礎(chǔ)語(yǔ)法 值得收藏!
這篇文章主要為大家推薦了一篇值得收藏和學(xué)習(xí)的vue.js最細(xì)致的基礎(chǔ)語(yǔ)法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11