前后分離后
export const download = function(options){
let xhr = new XMLHttpRequest(); // XMLHttpRequest 對象
xhr.open("GET", options.url, true);
xhr.setRequestHeader('Authorization', authorization());//前后分離的權限頭
xhr.send(obj2url(options.get));
xhr.responseType = "blob";//這里是關鍵,它指明返回的數(shù)據(jù)的類型是二進制
xhr.onreadystatechange = function(e) {
if (this.readyState == 4 && this.status == 200) {
console.log('change download');
var response = xhr.response;
let url = URL.createObjectURL(response);
img.src=url;//如果這里是圖片,可以顯示出圖片。
window.open(url);//想通過打開窗口來下載excel文件。卻不可以。
}
}
};
想通過download({url:"http://xxx.ssss:88/sss.xls"});來下載服務器的excel文件。
小伙看你根骨奇佳,潛力無限,來學PHP伐。
第一樓評論的很好啊
直接用 a標簽 然后模擬點擊,直接系統(tǒng)的下載就行了,何必還要自己去ajax請求。。而且還跨域了
祖?zhèn)髑岸讼螺djs,供你參考
function fake_click(obj) {
var ev = document.createEvent('MouseEvents');
ev.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
obj.dispatchEvent(ev);
}
function export_raw(name, data) {
var urlObject = window.URL || window.webkitURL || window;
var export_blob = new Blob([data]);
var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')
save_link.href = urlObject.createObjectURL(export_blob);
save_link.download = name;
fake_click(save_link);
}
先弄清楚倆問題,地址是否暴露給外網(wǎng)請求:
(1)如果暴露給外網(wǎng)
就直接寫a標簽href指向那個地址就OK了。
(2)如果只對內(nèi)網(wǎng)暴露
有兩種方法:
1.找運維給你配置地址,讓服務器excel文件夾暴露,然后走(1)
2.前端工程做一層代理,再往后端請求,就不跨域了,然后走(1),地址是你前端項目配置的地址。