blob轉(zhuǎn)換成string格式同步調(diào)用問(wèn)題解決分析
問(wèn)題背景
通過(guò)接口下載文件的時(shí)候,后端設(shè)置的responseHeader
content-disposition: attachment;filename=文件名.xlsx content-type: application/vnd.ms-excel;charset=utf-8
前端接口請(qǐng)求的時(shí)候,設(shè)置responseType: 'blob'
,后端接口直接返回的是文件流。
然后當(dāng)下載文件異常的情況下,接口直接返回的“文件下載出錯(cuò)”的文字,這個(gè)時(shí)候業(yè)務(wù)組件內(nèi)拿到的返回信息已經(jīng)被轉(zhuǎn)化成blob
格式了,所有需要把blob
轉(zhuǎn)成 string
,用來(lái)提示用戶下載異常。
代碼展示
請(qǐng)求響應(yīng)攔截處理
獲取文件流、文件名、文件后綴信息
// content-disposition: attachment;filename=文件名.xlsx const contentDisposition = response.headers['content-disposition'] const _fileName = contentDisposition.split('=')[1] const fileType = _fileName.substring(_fileName.lastIndexOf('.')); // .xlsx const fileName = _fileName.substring(0, _fileName.lastIndexOf('.')); // 文件名 if (fileName && fileType) { return { data: response.data, fileName, fileType } }
定義工具函數(shù)
因?yàn)榘?code>blob轉(zhuǎn)成string
需要用 FileReader
去讀取,FileReader
是異步的,所以這里需要用Promise
返回,方便業(yè)務(wù)組件同步調(diào)用
export const downloadFile = (srcData, fileName='下載', fileType='.xls', target='_self') { var blob = new Blob([srcData]) if (window.navigator && window.navigator.msSaveOrOpenBlob) { // 兼容IE/Edge window.navigator.msSaveOrOpenBlob(blob, fileName + fileType) } else { var url = window.URL.createObjectURL(blob) var a = document.createElement('a') a.href = url a.target = target a.style.display = 'none' a.setAttribute('download', fileName + fileType) document.body.appendChild(a) a.click() document.body.removeChild(a) window.URL.revokeObjectURL(url) // 釋放資源 } } export const blobToString = (blobData) => { return new Promise((resolve) => { if (blobData instanceof Blob) { const reader = new FileReader(); reader.readAsText(blobData, 'utf-8') reader.onload = function () { resolve(reader.result || '') } } else { resolve('') } }) }
業(yè)務(wù)組件調(diào)用
// 省略部分代碼 async down() { try { const res = await API(); const { data, fileName, fileType, code} = res || {} if (code === -1) { const result = await blobToString(data) this.$message.error(result) return } downloadFile(data, fileName, fileType) } catch (err) { console.log(err) } }
以上就是blob轉(zhuǎn)string同步調(diào)用問(wèn)題解決分析的詳細(xì)內(nèi)容,更多關(guān)于blob轉(zhuǎn)string同步調(diào)用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
純JS實(shí)現(xiàn)監(jiān)控本地文件變化
你是否曾夢(mèng)想擁有一個(gè)能夠?qū)崟r(shí)監(jiān)控本地文件變化的網(wǎng)頁(yè)應(yīng)用,現(xiàn)在,這個(gè)夢(mèng)想即將成為現(xiàn)實(shí),本文將通過(guò)純JS實(shí)現(xiàn)這一功能,感興趣的小伙伴可以了解下2025-04-04對(duì)象題目的一個(gè)坑 理解Javascript對(duì)象
這篇文章主要介紹了Javascript對(duì)象,特別為大家分享了對(duì)象題目的一個(gè)坑,提供了解題思路,感興趣的小伙伴們可以參考一下2015-12-12在js代碼拼接dom對(duì)象到頁(yè)面上的模板總結(jié)
今天小編就為大家分享一篇關(guān)于在js代碼拼接dom對(duì)象到頁(yè)面上的模板總結(jié),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10如何動(dòng)態(tài)的導(dǎo)入js文件具體該怎么實(shí)現(xiàn)
如何需要進(jìn)行動(dòng)態(tài)的導(dǎo)入js文件,那么下面的方法或許可以幫助到大家2014-01-01js打造數(shù)組轉(zhuǎn)json函數(shù)
這里給大家分享的是一段使用js實(shí)現(xiàn)數(shù)組轉(zhuǎn)換成json的函數(shù)代碼,代碼簡(jiǎn)潔易懂,并附上了使用方法,小伙伴們拿去試試。2015-01-01javascript實(shí)現(xiàn)手機(jī)震動(dòng)API代碼
一個(gè)新的API出來(lái)了。HTML5 (很快)將支持用戶設(shè)備振動(dòng)。這明顯是很有趣的事情,比如它可以用戶觸發(fā)提醒,提升游戲體驗(yàn),下面小編給大家整理javascript手機(jī)震動(dòng)api,需要的朋友可以參考下2015-08-08js實(shí)現(xiàn)表單多按鈕提交action的處理方法
這篇文章主要介紹了js實(shí)現(xiàn)表單多按鈕提交action的處理方法,需要的朋友可以參考下2015-10-10