最近做导出excel文件,怎么写下载的时候都是在浏览器输出的码,然后就想到是不是ajax请求不能直接请求下载文件,果然是这样。
ajax不能请求下载文件的原因:
因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成图片、文件下载等,然而ajax
只是个“字符型”的请求,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,虽然可以读取到
返回的response,但只是读取而已,是无法执行的,ajax的返回值类型是json,text,html,xml类型,或者可以说ajax的接收类型只能是string字符串,不是流类型,所以无法实现文件下载,说白点就是js无法调用浏览器的下载处理机制和程序
解决方式:
第一种:window.location.href
使用window.location.href = path+ '/export/exportData?param='+$("#upDataHidden").val();
但是因为我传到后台的值包含json型数据,用这种方式json型数据如果不做处理拼接会有问题,所以没用
第二种:和第一种大同小异,用这种是为了把数据传递到后台,先用ajax把数据传到后台,然后后台生成excel文件存在相应路径下,将该路径返回到前台,再用window.location.href下载
$.ajax({
url: requestPath + '/export/exportData',
params : {
"param":$("#upDataHidden").val()
},
success: function(response) {
var path = response.getParameter("path");
path = path.replace(/\\/g,".,");
window.location.href = $$pageContextPath + '/export/download?path='+path;
setTimeout(function() { //下载成功后删除在改路径下生成的临时文件
vm.delTempFile(path);
}, 3000)
}
})
第三种:使用form表单(个人认为最完美的方式,不需要转存,也不会受传递数据的影响)
前台代码:
var form = $("<form>");
form.attr("style","display:none");
form.attr("target","");
form.attr("method","post");
form.attr("action",$$pageContextPath + '/export/exportData');
var inputText = $("<input>");
inputText.attr("type","hidden");
inputText.attr("name","param");
inputText.attr("value",$("#upDataHidden").val());
$("body").append(form);
form.append(inputText);
form.submit();
form.remove();
-------------------------------------------------------------------------------------------
后台在生成excel文件后,可以直接:
HSSFWorkbook wb = new HSSFWorkbook();
。。。。。。。。。。。//此处省略处理excel内容
OutputStream os = response.getOutputStream();// 取得输出流
response.setContentType("application/vnd.ms-excel");
response.setHeader("content-disposition", "attachment; filename=" + new String(fileName.getBytes("GBK"), "ISO-8859-1") + ".xlsx");
System.setProperty("org.apache.poi.util.POILogger", "org.apache.poi.util.POILogger");
wb.write(os);
os.flush();
os.close();