需求:通过后端接口下载excel/docx文件(反正各种文件),后端没有文件地址,返回二进制流文件
一、接口地址
// 文件下载
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
请求头 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对象), 可以把 Blob对象 转换成一个链接地址,该地址可以直接用在某些 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对象), 可以把 Blob对象 转换成一个链接地址,该地址可以直接用在某些 DOM 的 src 或者 href 上
const link = document.createElement('a'); //创建a标签
link.href = window.URL.createObjectURL(blob); //创建下载的链接
link.download = fileName; //文件名
link.click(); //点击下载
window.URL.revokeObjectURL(link.href);
//window.URL.revokeObjectUR()下载链接)释放blob对象
link.remove(); //将a标签移除
}
2021.2.5更新
async download(){
let blob = new Blob([await downloadFlie()])
let excelName = '名称'
/* 兼容ie内核,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)
}
}