我可能会遗漏一些非常明显的东西,但无论我试图让下载按钮工作,只有在完整表格上使用POST才会有效,但是对于我需要的GET则不行(我不需要)想发布表单,因为我没有回复JSP期待的字符串答案,而是下载的附件。)
所以我得到了一个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,produce =“application / vnd.ms-excel”),尝试强制下载,似乎没什么用
注意:我已经更改了名称,所以它可能是getXls和getList之类的东西,但这不是问题。我的服务器端函数被调用,xls生成正常,我得到一个200-OK回来看似正确的标题/正文!我只是没有下载/查看我的文件...测试了两个版本的Firefox和Chrome。
答案 0 :(得分:1)
您的GET请求工作正常。
这就是:当您执行POST变体时,浏览器本身会使用附件处理响应,并询问您是否要下载/查看附件。
当您运行GET变体时,您对$.ajax
的javascript回调会收到响应(并且浏览器不会介入)。由于它对数据没有任何作用,因此没有任何反应(除了你切换指标和按钮的可见性)。
要解决您的原始问题(如何在没有表单的情况下下载),请阅读this问题并回答。