話不多說,先上代碼!
var blob = new Blob([result], {type: "application/vnd.ms-excel"});//result爲從後臺返回的數據
var objectUrl = window.URL.createObjectURL(blob);
var aForExcel = $("<a><span style='display:none;' class='forExcel'>下載excel</span</a>")
.attr("href",objectUrl)
.attr("download","下載的文件");
$("body").append(aForExcel);
$(".forExcel").click();
URL.revokeObjectURL(objectUrl);
aForExcel.remove();
這段代碼表示將從後臺獲取到的數據以表格形式(.xls)下載下來,經測試,在 Chrome、Firefox、Safari、360瀏覽器中,均可以成功下載文件,但是在Edge和IE中,什麼反應都沒有。
在查了很多資料之後,終於找到了原因:
IE / Edge 和高大上的 Chrome /Firefox 對於window.URL.createObjectURL 創建Blob鏈接最直觀的區別在於得到的blob鏈接形式不一樣,Chrome 和 Firefox 會生成的帶有當前域名的標準blob鏈接形式(例如https : //www.wuxiancheng.cn/86e01467-6654-4b74-98b3-ca25f396bc2f),而 IE 和 Edge 會生成的不帶域名的blob鏈接(例如242CACD6-06D5-4145-A6DA-55DBE47409DB),所以如果用上面代碼的方式,是下載不了文件的,並且瀏覽器也不會報錯。
解決辦法來啦:
使用 window.navigator.msSaveOrOpenBlob(blob, filename),代替 window.URL.createObjectURL。
window.navigator.msSaveOrOpenBlob(blob, filename),第一個參數blob就是Blob對象,第二個參數filename是希望將Blob URL保存的文件名(加上後綴,例如 下載的文件.xls),具體代碼如下:
var blob = new Blob([result], {type: "application/vnd.ms-excel"});//result爲從後臺返回的數據
if('msSaveOrOpenBlob' in navigator){
window.navigator.msSaveOrOpenBlob(blob, "下載的文件.xls");
}else{
var objectUrl = window.URL.createObjectURL(blob);
var aForExcel = $("<a><span style='display:none;' class='forExcel'>下載excel</span</a>")
.attr("href",objectUrl)
.attr("download","下載的文件");
$("body").append(aForExcel);
$(".forExcel").click();
URL.revokeObjectURL(objectUrl);
aForExcel.remove();
}
這樣就解決啦!