后臺返回文件流,前端實現(xiàn)預覽pdf

PDFJS:?https://mozilla.github.io/pdf.js/? ???支持獲取文件流到客戶端,生成blob地址預覽

ViewerJS:?http://viewerjs.org/? ?預覽pdf文件,其pdf文件只能url地址

這個項目是基于vue的,但發(fā)現(xiàn)實現(xiàn)起來可以忽略,直接把官網(wǎng) 下載的文件,build文件夾和web文件夾全都放在項目的static文件夾下,

我在實現(xiàn)功能時,看了一些其余博客都是要把viewer.js里面的

varDEFAULT_URL='compressed.tracemonkey-pldi-09.pdf'? 這個里面是PDF的路徑刪除該變量定義;

這一步我沒有操作最后也實現(xiàn)功能。

有些人是在view.html里面直接加代碼段什么的,但是我這個項目是要在某個組件里面,選擇符合條件的訂單才能預覽pdf,所以我把有關view.html里面操作的相關方法都pass掉了。

然后調(diào)取后臺接口,發(fā)現(xiàn)幾個問題

直接在Network里面看的圖
接口返回的數(shù)據(jù)

兩者的內(nèi)容完全不一樣,通過查資料發(fā)現(xiàn),我的腳手架里面

// 設置默認返回數(shù)據(jù)類型? ? axiosIns.defaults.responseType ='json'

于是我在調(diào)接口的時候要改變類型,剛開始我設置成了blob,還有arrayBuffer發(fā)現(xiàn)都不對,后來還是在network里面查看了一下,發(fā)現(xiàn)后臺需要的是另外一個,于是如下操作

responseType:"multipart/form-data"

這樣拿到的data值和看到的就是一樣的,就是所謂的文件流

最開始我的想法是,把拿到的文件流轉化為url地址就可以了,,用了window.url.createObjecturl這個方法,發(fā)現(xiàn)報錯了

let pdfurl=window.url.createobjecturl(data.data);

console.log(pdfurl);

window.url.createObjecturl方法報錯

后來又找解決方法,發(fā)現(xiàn)要這么寫:

var binaryData = [];

binaryData.push(data.data);

this.url =window.URL.createObjectURL(new Blob(binaryData, {type:"application/zip"}));

console.log(this.url);

blob:http://localhost:8080/c680cd37-19d5-41af-bbb7-747ca0c3b39a

以blob:開關的url地址

注: 這個方法對瀏覽器版本有要求?


支持版本


在控制臺驗證所使用瀏覽器是否支持window.url.createObjectURL

寫到這兒以為成功了,最后出現(xiàn)的pdf,頁碼和后臺實現(xiàn)的頁數(shù)一樣,但是每一頁都是空白。

后來去網(wǎng)上找,發(fā)現(xiàn)沒有人出現(xiàn)過這種情況,嘗試了解決,還是解決不了。

于是,準備換思路。

直接把文件流當作地址賦值過去,

window.open('/static/pdf/web/viewer.html?file=' +encodeURIComponent(this.url));

這里的this.url是整個調(diào)取接口完整的值,

加了encodeURlComponent()是因為接口里會出現(xiàn) export?id=213這種形式的

如果有export?id=123&aa=123這種的最后加上 &.pdf 至于原理可以去搜一下

這個時候會出現(xiàn)

has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access.viewer.js:1352 Uncaught (in promise) Error: 意外的服務器響應。 at viewer.js:1352 at

PDF.js v1.9.426 (build: 2558a58d)

信息:Unexpected server response (0) while retrieving PDF

看到資料上說,本地有跨域問題去了線上就可以了,于是我就發(fā)版了,然后發(fā)現(xiàn)線上顯示地址錯誤404,由此可以看出我地址出錯了

后來一直改地址,我的線上地址是https://aaaaaa/bbbb/#/

于是我又把原來的地址改動了一下,

window.open('/bbbb/static/pdf/web/viewer.html?file=' +encodeURIComponent(this.url));

然后本地運行是404,但是發(fā)到線上就能成功打開pdf.js文件了。

不容易啊,里面有好多坑,別人的博客可以借鑒,不過每個人遇到的問題還是有點區(qū)別的。

看了這么多博客,有一篇對我?guī)椭畲?,在這里放上地址。

https://blog.csdn.net/shentibeitaokong/article/details/80011900

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容