通过axios发送POST申请 下载文件。
这时候的 Content-Type: application/json;charset=UTF-8
先贴
axios({ method: 'post', url: 'xxx/xxx', data: {***}, responseType: 'blob', // 这里很重要,如果没有,respons.data 为'',传了返回的data是Blob格局。}).then(response => { const disposition = response.headers['content-disposition']; if (disposition && disposition.indexOf('attachment') !== -1) { postDownload(response.data, '结算单.xls'); }}).catch((error) => { // 这里catch我没试过,抄的。。 也不晓得对不对 if(error.request.responseType === 'blob') { let errInfo = {}; let reader = new FileReader(); reader.readAsText(err.response.data, 'UTF-8'); reader.onload = function () { errInfo = JSON.parse(reader.result); data.error && data.error.call(this, errInfo) }; } else { data.error && data.error.call(this, err.response.data) }})
与后盾沟通好response header的设置,并规定好fileName的编码方式,不便前端拿到后解析
content-disposition: attachment;fileName=%E9%81%A5%E6%84%9F%E8%A7%A3%E8%AF%91%E6%95%B0%E6%8D%AE.xls content-type: application/octet-stream
我这边的后端也是抄的局部代码 返回的content-disposition里的fileName他也不晓得是什么编码。。
content-disposition: "attachment;filename=ç»ç®å.xls"我解析不了 就写死了
这个是 传入(blob, filename)下载的函数,这是从别处抄的
function postDownload(blob, filename) { if (typeof window.navigator.msSaveBlob !== 'undefined') { // IE window.navigator.msSaveBlob(blob, filename); } else { const URL = window.URL || window.webkitURL; const downloadUrl = URL.createObjectURL(blob); if (filename) { // use HTML5 a[download] attribute to specify filename const a = document.createElement('a'); // safari doesn't support this yet if (typeof a.download === 'undefined') { window.location = downloadUrl; } else { a.href = downloadUrl; a.target = '_blank'; a.download = filename; document.body.appendChild(a); a.click(); } } else { window.location = downloadUrl; } setTimeout(() => { URL.revokeObjectURL(downloadUrl); }, 100); // cleanup } }
表单post下载
我感觉更简略。和第一种略有区别,这个我没用过,先贴着,当前用失去。
原理: 创立一个暗藏form表单,通过form表单的提交刷新性能,实现下载。代码如下:
downloadExcel(url, obj) { let tempForm = document.createElement('form'); // var token = window.token || '' // if (url && token) { // if (url.indexOf('?') !== -1) { // url = url + '&token=' + token; // } else { // url = url + '?token=' + token; // } // } tempForm.action = url; tempForm.method = 'post'; tempForm.onsubmit = "return false"; tempForm.style.display = 'none'; for (let st in obj) { if (obj.hasOwnProperty(st)) { let opt = document.createElement('textarea'); opt.name = st; opt.value = obj[st]; tempForm.appendChild(opt); } } document.body.appendChild(tempForm); tempForm.submit(); return tempForm;}
这时候的 Content-Type: application/x-www-form-urlencoded; charset=UTF-8