blob轉(zhuǎn)換成string格式同步調(diào)用問題解決分析
問題背景
通過接口下載文件的時(shí)候,后端設(shè)置的responseHeader
content-disposition: attachment;filename=文件名.xlsx content-type: application/vnd.ms-excel;charset=utf-8
前端接口請求的時(shí)候,設(shè)置responseType: 'blob',后端接口直接返回的是文件流。
然后當(dāng)下載文件異常的情況下,接口直接返回的“文件下載出錯(cuò)”的文字,這個(gè)時(shí)候業(yè)務(wù)組件內(nèi)拿到的返回信息已經(jīng)被轉(zhuǎn)化成blob格式了,所有需要把blob轉(zhuǎn)成 string,用來提示用戶下載異常。
代碼展示
請求響應(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)用問題解決分析的詳細(xì)內(nèi)容,更多關(guān)于blob轉(zhuǎn)string同步調(diào)用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript webpack模塊打包器如何優(yōu)化前端性能
本系列主要整理前端面試中需要掌握的知識點(diǎn)。本節(jié)介紹webpack如何優(yōu)化前端性能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
微信小程序使用template標(biāo)簽實(shí)現(xiàn)五星評分功能
這篇文章主要為大家詳細(xì)介紹了微信小程序使用template標(biāo)簽實(shí)現(xiàn)五星評分功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
JS實(shí)現(xiàn)數(shù)組/對象數(shù)組刪除其中某一項(xiàng)
這篇文章主要介紹了JS實(shí)現(xiàn)數(shù)組/對象數(shù)組刪除其中某一項(xiàng),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
javascript下過濾數(shù)組重復(fù)值的代碼
javascript下過濾數(shù)組重復(fù)值的代碼...2007-09-09
javascript實(shí)現(xiàn)下班倒計(jì)時(shí)效果的方法(可桌面通知)
這篇文章主要介紹了javascript實(shí)現(xiàn)下班倒計(jì)時(shí)效果的方法,涉及javascript倒計(jì)時(shí)效果及桌面提示效果的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值2015-07-07

