需求:通過后端接口下載excel/docx文件(反正各種文件),后端沒有文件地址,返回二進(jìn)制流文件
一、接口地址
// 文件下載
export function downloadFlie (fileId, fileName) {
return request({
url: '/v1/downLoad/' + fileId + '/' + fileName,
method: 'GET',
responseType: 'arraybuffer', //blob
headers: {
'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
}
})
}
注意:
responseType 必須為arraybuffer或者blob
請(qǐng)求頭 Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
二、使用
1、不修改文件名
async download(){
let blob = new Blob([await downloadFlie(this.fileId, this. fileName)], { type: "application/[vnd.ms-excel;charset=utf-8](vnd.ms-excel;charset=utf-8)" });
// 通過 URL.createObjectURL(Blob對(duì)象), 可以把 Blob對(duì)象 轉(zhuǎn)換成一個(gè)鏈接地址,該地址可以直接用在某些 DOM 的 src 或者 href 上
let objectUrl = URL.createObjectURL(blob); //
window.location.href = objectUrl; //
}
2、修改文件名
async download(){
let fileName = '哈哈哈.docx'
let blob = new Blob([await downloadFlie(this.fileId, fileName)], { type: "application/[vnd.ms-excel;charset=utf-8](vnd.ms-excel;charset=utf-8)" });
// 通過 URL.createObjectURL(Blob對(duì)象), 可以把 Blob對(duì)象 轉(zhuǎn)換成一個(gè)鏈接地址,該地址可以直接用在某些 DOM 的 src 或者 href 上
const link = document.createElement('a'); //創(chuàng)建a標(biāo)簽
link.href = window.URL.createObjectURL(blob); //創(chuàng)建下載的鏈接
link.download = fileName; //文件名
link.click(); //點(diǎn)擊下載
window.URL.revokeObjectURL(link.href);
//window.URL.revokeObjectUR()下載鏈接)釋放blob對(duì)象
link.remove(); //將a標(biāo)簽移除
}
2021.2.5更新
async download(){
let blob = new Blob([await downloadFlie()])
let excelName = '名稱'
/* 兼容ie內(nèi)核,360瀏覽器的兼容模式 */
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(blob, `${excelName}.xls`)
} else {
/* 火狐谷歌的文件下載方式 */
var downloadElement = document.createElement('a')
var href = window.URL.createObjectURL(blob)
downloadElement.href = href
downloadElement.download = `${excelName}.xls`
document.body.appendChild(downloadElement)
downloadElement.click()
document.body.removeChild(downloadElement)
window.URL.revokeObjectURL(href)
}
}