解決前端接收 type:"application/octet-stream" 格式的數(shù)據(jù)并下載(解決后端返回不唯一問題)
前端接收 type: “application/octet-stream“ 格式的數(shù)據(jù)并下載,還有后端既返回octet-stream還返回JSON數(shù)據(jù)時的處理方法
今天些項目的時候,后端改了一下文件下載的方式,打算用接口返回 type: “application/octet-stream“
格式的數(shù)據(jù),然后前端來處理下載。今天也是第一次用這種方法,查詢了網(wǎng)上的內(nèi)容總結了一下。
第一步
在 響應攔截器中作出初步的判斷
這里判斷if是針對這種情況時做出的應對方法,可能還有其他情況,這里只是最簡單的。
service.interceptors.response.use( response => { // 導出 const headers = response.headers if (headers['content-type'] === 'application/octet-stream;charset=utf-8') { return response.data } ...//這里時其他的情況 }, error => { return Promise.reject(error) } )
第二步
對api進行修改
這是我的axios的寫法,按各自的走就行
第三步
發(fā)起請求,對請求到的數(shù)據(jù)進行處理下載
exportClick () { export().then(res => { const content = res const blob = new Blob([content]) const fileName = '導出信息.xlsx' if ('download' in document.createElement('a')) { // 非IE下載 const elink = document.createElement('a')//創(chuàng)建一個a標簽通過a標簽的點擊事件區(qū)下載文件 elink.download = fileName elink.style.display = 'none' elink.href = URL.createObjectURL(blob)//使用blob創(chuàng)建一個指向類型數(shù)組的URL document.body.appendChild(elink) elink.click() URL.revokeObjectURL(elink.href) // 釋放URL 對象 document.body.removeChild(elink) } else { // IE10+下載 navigator.msSaveBlob(blob, fileName) } }) }
本來是已經(jīng)寫完這個功能了,但后臺告訴我有可能沒有文件,然后他要給我返回json數(shù)據(jù)格式
我又懵了一會,又查了半天資料,終于是完善好了
當返回的數(shù)據(jù)類型既有可能是JSON又可能是octet-stream時
第一步
首先我們不能改變原來的代碼
這一行對于接收文件是必須的,但是這樣又會讓我們的數(shù)據(jù)變成blob類型
上面是有文件時的樣子
這是沒有文件的樣子
可以注意到 blob有 type這個數(shù)據(jù),我們就可以根據(jù)這個type來判斷進行下一步處理
if (res.type == "application/json") { ... } if (res.type == "application/octet-stream"){ ... }
其中是octet-stream類型時的操作我們上面就已經(jīng)寫道了
下面介紹如何轉換為json
第二步:將blob轉換為json數(shù)據(jù)
這里要先用FilerReader,不可以直接使用JSON.parse
if (res.type == "application/json") { // console.log("type == json"); const reader = new FileReader(); //通過fileReader將blob類型的數(shù)據(jù)轉換成json格式的數(shù)據(jù) reader.readAsText(res, "utf-8"); reader.onload = function () { //讀取完成后返回字符串形式的內(nèi)容 // console.log("reader.result", reader.result); const msg = JSON.parse(reader.result); console.log("JSON轉換結果", msg); //...這里時對轉換后結果的操作 } }; }
到這里下載文件的種種問題就解決啦,寫個博客紀念一下,第一次處理這種問題
轉載說明:
借鑒原作者:https://blog.csdn.net/u010598111/article/details/85052865
到此這篇關于前端接收 type: “application/octet-stream“ 格式的數(shù)據(jù)并下載,解決后端返回不唯一的文章就介紹到這了,更多相關接收application/octet-stream格式的數(shù)據(jù)并下載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
javascript 實現(xiàn)簡單的table排序及table操作練習
在這個列子中,練習了table的操作,主要有:tBodies、rows、cells,還有有關數(shù)組的排序方法:sort,按興趣的朋友可以研究下2012-12-12JS無限極樹形菜單,json格式、數(shù)組格式通用示例
本文為大家介紹下JS無級樹形菜單的實現(xiàn),修改了一下數(shù)據(jù)格式,是json和數(shù)組或者混合型的數(shù)據(jù)都通用,不用特定key等,想學習的朋友可以參考下2013-07-07