js ajax 關於post請求接口導出文件的寫法


現在不管后端使用什么插件,都會生成一個文件流,然后大部分情況下會使用window.location的方式請求打開這個url,然后直接下載文件

但是有時候在兼顧查詢使用了post方式的情況下,使用post方式請求導出可以減輕部分工作量,於是開始探索相關寫法,最終代碼如下:

 

$.ajax({
url: url,
type: 'POST',
data: {
param: Jparam
},
xhrFields: { responseType: "blob" },
success: function(data,status,request) {
var disp = request.getResponseHeader('Content-Disposition')
layer.close(dh);
var fileName
let filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/
let matches = filenameRegex.exec(disp)
if (matches != null && matches[1]) {
fileName = matches[1].replace(/['"]/g, '')
}
// 通過 URLEncoder.encode(pFileName, StandardCharsets.UTF_8.name()) 加密編碼的, 使用decodeURI(fileName) 解密
fileName = decodeURI(fileName)
var urlCreator = window.URL || window.webkitURL;
var blob = new Blob([data], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
var url = urlCreator.createObjectURL(blob); //這個函數的返回值是一個字符串,指向一塊內存的地址。
//以下代碼保存我的excel導出文件
var link = document.createElement('a'); //創建事件對象
link.setAttribute('href', url);
link.setAttribute("download", fileName);
var event = document.createEvent("MouseEvents"); //初始化事件對象
event.initMouseEvent("click", true, true, document.defaultView, 0, 0, 0, 0, 0, false, false, false, false, 0, null); //觸發事件
link.dispatchEvent(event);
}
})

由於文件名是從ResponseHeader('Content-Disposition')中讀取的,讀取時發現了一個問題,即中文會出現亂碼,這種情況需要后端將文件名中文部分進行urlencode處理,然后前端通過decodeURI()解析即可
如果沒有需求,可以寫死filename,無需解析ResponseHeader('Content-Disposition')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM