我需要向后端提交用户输入(最好通过自定义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服务调用吗?