解決微軟Edge瀏覽器和IE瀏覽器下載無反應的問題

話不多說,先上代碼!

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();
}

這樣就解決啦!



參考文章:
https://www.51-n.com/t-4535-1-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章