编辑
根据我所了解到的(来自 nico_ekito 的评论),无法使用 ajax 调用来下载文件。解决方案是创建一个<iframe>
将下载文件的隐藏文件,如here所述。
问题:浏览器不显示下载对话框。任何浏览器 - ff、opera、chrome、safari 等。
我阅读了有关服务文件的文档,发现了这个问题,并在此基础上写道:
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
POST
firebug 中的选项卡以正确的 csv 格式显示正确的数据。要使用 csv 样式格式化数据,我使用dojox/grid/enhanced/plugins/exporter/CSVWriter