修改
根据我所学到的(来自nico_ekito的评论),无法使用ajax调用来下载文件。解决方案是创建一个隐藏的<iframe>
,用于下载文件,描述为here。
问题: 浏览器不显示下载对话框。任何浏览器 - ff,opera,chrome,safari,即。
我阅读了有关服务文件的docs,找到了this question,并在此基础上写道:
Controller.response().setContentType("text/csv");
Controller.response().setHeader("Content-Disposition", "attachment;filename=public/export/filename.csv");
Controller.response().setHeader("Cache-control", "private");
return ok(CSV.export(data, filename));
CSV
是一个类:
public class CSV{
public static File export(Map<String, String> data, String filename){
String csv = data.get("data[saveMe]");
try {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("public/export/" + filename), "UTF-8"));
bw.write(csv);
bw.newLine();
bw.flush();
bw.close();
}catch(UnsupportedEncodingException e){}
catch(FileNotFoundException e){}
catch(IOException e){}
File downloadMe = new File("public/export/" + filename);
return downloadMe;
}
}
在客户端,我使用dojo
发送POST
请求(我也尝试使用GET
,结果是相同的):
xhr.post({
url: '/exportData/',
content: {
saveMe: str
}
}).then(function(response){
//do sth
});
响应标题如下:
Cache-Control private
Content-Disposition attachment;filename=public/export/filename.csv
Content-Type text/csv
Transfer-Encoding chunked
firebug中的 POST
选项卡以适当的csv格式显示正确的数据。要使用csv样式格式化数据,请使用dojox/grid/enhanced/plugins/exporter/CSVWriter
答案 0 :(得分:3)
我认为无法从Ajax请求下载文件,请参阅此问题:Allow User to Download File using Ajax
您应该按照问题中的建议使用iframe,或者使用包含数据的标准HTML表单,并在此表单上发帖。