ajax 文件下载成功,但内容全部为乱码问题。尝试以下方法解决:

乱码

在这里插入图片描述

原生xhr请求

let uri = '/queryExport'
let xhr = new XMLHttpRequest()
xhr.onload = function(e) {
    if (this.status == 200) {
    	/* 文件下载 */
        let blob = new Blob([this.response], {
            type: "application/vnd.ms-excel;charset=UTF-8"
        })
        let downloadUrl = window.URL.createObjectURL(blob)
        let link = document.createElement('a')
        link.href = downloadUrl
        link.download = '统计.xlsx'
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
        window.URL.revokeObjectURL(downloadUrl)
    }
    hideLoading_dialog()
}
xhr.open("POST", uri, true)
/* 重点:后端返回的响应类型为 arraybuffer,不是常用的 blob */
xhr.responseType = "arraybuffer"
/* 此处为后端接受请求数据的 MIME 类型  */
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
let param = new URLSearchParams()
param.append("startTime", startTime)
param.append("endTime", endTime)
xhr.send(param)

jQuery.ajax 请求jQuery>=v2.2.0

$.ajax({
  url:url,
  xhrFields: {
  	responseType: "arraybuffer"
  },
  data: {
  	startTime: startTime,
  	endTime: endTime
  },
  success:function(data){
    console.log(data); //ArrayBuffer
    console.log(new Blob([data])) // Blob
    /* 文件下载 */
    let blob = new Blob([data], {
        type: "application/vnd.ms-excel;charset=UTF-8"
    })
    let downloadUrl = window.URL.createObjectURL(blob)
    let link = document.createElement('a')
    link.href = downloadUrl
    link.download = '统计.xlsx'
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
    window.URL.revokeObjectURL(downloadUrl)
  }
})

jQuery 相关问题涉及版本

jQuery 中文官方文档
jQuery github
jQuery >=v1.5.1 支持 xhrFields 设置。
jQuery >=v2.2.0 支持responseType数据类型为binary时返回,不再抛出异常。(Ajax: Don’t throw exceptions on binary data response)

ArrayBuffer 和 Blob 的区别

responseType

更多推荐