Java-Spring-JSP下载xls文件 – POST OK,GET不能正常工作

我可能会错过一些非常明显的东西,但不pipe我尝试让下载button工作,只有在完整的表单上使用POST,而不使用GET,我才需要(我不想发布该表单,因为我不回馈JSP所期望的string答案,而是一个附件下载)。

所以我得到了一个带有一个button的表单的JSP页面,用于下载一个生成的xls文件。 如果我张贴表单我得到xls下载。 这里是代码:

@RequestMapping(params = "exportButton", method = RequestMethod.POST) public void exportXls(Model model, @ModelAttribute("form") XXXForm form, HttpServletResponse response) throws IOException { // generate xls... response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment; filename=xxx.xls"); workbook.write(response.getOutputStream()); //an api to generate xls workbook.close(); response.flushBuffer(); } } 

所以这个工作很好张贴时:

 <form:form id="xxxForm" method="post" modelAttribute="xxxForm" cssClass="cleanform" action="xxx"> <button type="submit" id="exportButton" name="exportButton" class="printButton">Export</button> 

但是如果我尝试使用get:

 <button type="button" id="exportButton" class="printButton" onclick="getReportInXls()">Export</button> 

使用Javascript:

 function getReportInXls() { $('#progressIndicatorImage').show(); $('#exportButton').hide(); $.ajax({ url : 'getListXml', success : function(data) { $('#progressIndicatorImage').hide(); $('#exportButton').show(); } }); } 

Java和映射的改变是一样的。 函数被调用,xls被生成,并且响应到达,我得到一个200-OK响应,附件在正文(二进制)中,头部有Content-Disposition中的附件:

响应标题:

 Cache-Control no-cache, no-store Content-Disposition attachment; filename=hotel.xls Content-Type application/vnd.ms-excel Date Wed, 29 Jul 2015 09:27:59 GMT Expires Thu, 01 Jan 1970 00:00:00 GMT Pragma no-cache Server Apache-Coyote/1.1 Transfer-Encoding chunked 

然而,我没有提供下载/查看文件。 浏览器端没有任何反应。 我在服务器端和客户端都尝试了一些安静的东西。 我已经写了@ResponseBody注解,我试着添加@RequestMapping(value =“/ getXls”,method = RequestMethod.GET,生产=“application / vnd.ms-excel”),尝试强制下载,似乎没有任何工作。

注意:我更改了名称,所以它可能是getXls,而另一次是getList,但这不是问题。 我的服务器端函数被调用,xls生成正常,我得到一个200 – OK看起来正确的标题/正文! 我只是没有得到下载/查看我的文件…testing在两个版本的Firefox和铬。

您的GET请求正常工作。

这就是发生了什么情况:当您执行POST变体时,浏览器本身处理附件的响应并询问您是否要下载/查看附件。

当您运行GET变体时,您的JavaScriptcallback到$.ajax接收响应(并且浏览器不介入)。 而且由于它对数据没有任何作用,所以什么都不会发生(除了你切换指示器和button的可见性)。

要处理你的原始问题(如何下载没有表格文章),请阅读这个问题,它的答案。