针对Ajax无法下载数据流文件,且网上资料较少,现整理代码如下:
/**
* 公共导出功能
* url:请求后台地址
* name:下载文件名称
* data: 请求参数
* type: 请求类型 post get
* */
function excel_export(type, url, name, data) {
//var layerIndex=layer.msg('正在导出文件,请稍后...', {icon: 16,shade: 0.01,time: 100000 });
var xhr=null;
if (window.XMLHttpRequest) {//Mozilla 浏览器
xhr = new XMLHttpRequest();
}else {
if (window.ActiveXObject) {//IE 浏览器
try {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {
try {//IE 浏览器
xhr = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
}
}
}
}
xhr.open(type, url, true);
xhr.responseType = "blob";
xhr.setRequestHeader("Authorization", sessionStorage.getItem('cookieKey'));
//post请求一定要添加请求头才行不然会报错
if(type=='POST'){
xhr.setRequestHeader("Content-type","application/json");
}
xhr.onload = function() {
if (this.status == 200) {
console.info(this.getResponseHeader("content-disposition"));
var fileName = this.getResponseHeader("content-disposition").split(";")[1].split("filename=")[1];
var blob = this.response;// this.response也就是请求的返回就是Blob对象
var a = document.createElement('a');
//一个字符串,表明该Blob对象所包含数据的MIME类型
blob.type = "application/excel";
var url = URL.createObjectURL(blob);
a.href = url;
$("body").append(a);
a.download = fileName;
if(!!window.ActiveXObject || "ActiveXObject" in window){
window.navigator.msSaveOrOpenBlob(blob, fileName)
}else {
a.click()
}
window.URL.revokeObjectURL(url);
}else{
// layer.msg('导出错误!')
}
}
xhr.send(data);
}
方法可以直接使用;
在controller层
public void export(HttpServletResponse response, @RequestBody @Validated Form form, BindingResult result){
response.setContentType("application/octet-stream; charset=utf-8"); //设置响应头,控制浏览器下载该文件
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(expName, "UTF-8"));
in = new FileInputStream(filePath + fileName); //读取要下载的文件,保存到文件输入流
out = response.getOutputStream(); //创建输出流
byte buffer[] = new byte[102400]; //创建缓冲区
int len = 0;
//循环将输入流中的内容读取到缓冲区当中
while((len=in.read(buffer))>0){
out.write(buffer, 0, len); //输出缓冲区的内容到浏览器,实现文件下载
}
}
即可以使用。
可以解决那此 Content type ** not supported 的问题。
感谢 https://blog.csdn.net/skye_Z/article/details/81135540 作者!
结束,闪出... ...