Java-Spring-JSP下载xls文件 - POST OK,GET无效

时间:2015-07-29 09:46:48

标签: java excel spring jsp downloading

我可能会遗漏一些非常明显的东西,但无论我试图让下载按钮工作,只有在完整表格上使用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。

1 个答案:

答案 0 :(得分:1)

您的GET请求工作正常。

这就是:当您执行POST变体时,浏览器本身会使用附件处理响应,并询问您是否要下载/查看附件。

当您运行GET变体时,您对$.ajax的javascript回调会收到响应(并且浏览器不会介入)。由于它对数据没有任何作用,因此没有任何反应(除了你切换指标和按钮的可见性)。

要解决您的原始问题(如何在没有表单的情况下下载),请阅读this问题并回答。