方法一:
使用传统方法
// 使用location直接访问,后端将文件写入responce即可
window.location.href = url;
后端设置响应头
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("RowData", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
// response.getOutputStream() 将数据写入 响应体的返回流即可
方式一可以获取单个文件,如果我一次要获取多个文件,那么当你第一发送请求,文件还没来得及返回,立马发送第二次请求,那么第一次请求会被取消。
使用方式二,两次请求都会间隔很短发送出去,但是第二次请求不会被覆盖。
方式二:
var filepath = e.getAttribute("file").split(";");
for (let i = 0; i < filepath.length-1; i++) {
/*var url = urlPath+"system/file?&filePath="+filepath[i].replace("#","%23");
window.location.href = url;*/
var url = urlPath+"system/file?&filePath="+filepath[i].replace("#","%23"); //井号不处理的话,后端获取不到#后面的内容,必须转义处理
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);//get请求,请求地址,是否异步
xhr.responseType = "blob"; // 返回类型blob
xhr.onload = function () {// 请求完成处理函数
if (this.status === 200) {
var blob = this.response;// 获取返回值
var a = document.createElement('a');
a.download = filepath[i];
a.href=window.URL.createObjectURL(blob);
a.click();
}
};
// 发送ajax请求
xhr.send();
}
为什么不使用ajax呢,因为ajax不支持文件下载。