从AJAX Web服务开始下载动态生成的CSV文件

时间:2014-04-24 22:21:26

标签: javascript ajax web-services spring-mvc csv

我需要向后端提交用户输入(最好通过自定义DTO),以便为用户下载动态生成CSV文件。我正在使用Spring MVC和基于Web服务的客户端应用程序。

我已就此问题的潜在原因进行了一些研究。我知道我不能使用AJAX来提示下载。无论我将Content Disposition设置为什么,它都会将CSV数据作为字符串返回给浏​​览器。经常提出的解决方案是通过JavaScript将用户重定向到下载链接。我不认为这对我有用1)它不是静态下载,2)参数很复杂,3)我需要使用CAC PKI安全性(我将通过AJAX Web服务调用实现)

下面是我为测试这个概念而创建的一个简单方法。

@RequestMapping(value = "committees/exportCommittees", method = RequestMethod.POST, consumes = "application/json")
public void getMailingAddressesByCommittee(
        @RequestBody final ExportMailingLabelDTO exportMailingLabelDTO,
        HttpServletResponse response) throws JsonParseException,
        JsonMappingException, IOException {
    // In future, ExportMailingLabelDTO will be used to filter 
            // the returned data based on user input.


    String csvFileName = "mailmerge.csv";

    response.setContentType("text/csv");

    String headerKey = "Content-Disposition";
    String headerValue = String.format("attachment; filename=\"%s\"",
            csvFileName);
    response.setHeader(headerKey, headerValue);

    StringWriter sw = new StringWriter();

    CSVWriter csvWriter = new CSVWriter(sw, CSVWriter.DEFAULT_SEPARATOR,
            CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER);
    String[] columns = new String[] { "ID" };
    csvWriter.writeNext(columns);

    String[] values;

    values = new String[] { "1", "2", "3" };
    csvWriter.writeNext(values);
    PrintWriter out = response.getWriter();
    out.println(sw.toString());
    csvWriter.close();
}

ExportMailLabelDTO包含根据用户输入过滤返回数据的信息。

当我通过AJAX Web服务调用此方法时,它会通过字符串将数据返回给浏览器,但不会提示下载。

function exportMailingAddressesByCommittee(committeeList) {
var seen = [];
var data = $.ajax({
    type : "POST",
    contentType : 'application/json',            
    url : urlCommitteesBase + "exportCommittees",
    data : JSON.stringify(committeeList, function(key, val) {
           if (typeof val == "object") {
                if (seen.indexOf(val) >= 0)
                    return
                seen.push(val);
            }
            return val; })
});
return data;
}

如果我使用稍微修改过的方法删除参数并将其直接放在URL栏中,它将提示下载。

那么,有没有办法通过AJAX Web服务实现这一目标?这只能通过非AJAX Web服务调用吗?

0 个答案:

没有答案