此篇博客是下载服务器文件到客户端,包括前端和后端。
刚开始做的时候,我前端使用的是ajax 请求数据到后端,然后在后端做文件转换。不管怎么做,网页都没有半点反应,不会弹出像这样的文件下载提示框
看了几篇博客后,才发现是ajax请求的问题,于是改成了form表单提交。这个问题就解决了。
直接上干货:
html:
<button type="button" class="form-control" style="background-color: #36648B; font-size: 16px; color: #FFFFFF;" id="print" οnclick="PrintExcel()">列印</button>
JS:
function PrintExcel(){
if($("#acc_no").val()==""){
alert("文件编码不能为空!")
return false;
}else{
//文件下载的时候 用ajax请求后台,网页没有反应。用form 表单提交能自动的收到流信息,所以这里用form 表单提交更好
var temp_form = document.createElement("form");
// 设置form属性
temp_form .action = url;
temp_form .target = "_self";
temp_form .method = "post"; //请求方式
temp_form .style.display = "none";
var opt = document.createElement("textarea");
opt.name = "acc_no";
opt.value = $("#acc_no").val(); //传给后台的值
temp_form .appendChild(opt);
document.body.appendChild(temp_form);
temp_form .submit();
}
}
后台:
@RequestMapping(value="/printExcel",method = RequestMethod.POST)
@ResponseBody
public void PrintExcel(@RequestBody String obString,HttpServletRequest request,HttpServletResponse response) throws Exception {
// 输入流
FileInputStream input = new FileInputStream("D:\ExcelPath\50.xlsx"); //获取服务器上文件
// 设置头
resp.setHeader("Content-Type","xlsx"); //我这里是Excel 文件,格式是xlsx类型
resp.setHeader("Content-Disposition", "50.xlsx");
// 获取绑定了客户端的流
ServletOutputStream output = resp.getOutputStream();
// 把输入流中的数据写入到输出流中
IOUtils.copy(input,output);
input.close();
}
此时网页上就能弹出下载提示框。
如果对你有帮助, 给点赞赏哈