在我的webapp中,我希望用户下载一个csv文件作为对POST ajax请求的响应。 响应被正确发送,看起来没问题,但是在ajax.success()没有任何反应。
我不想在服务器上永久写一个文件,所以我直接写在PrintWriter中,我读过这应该有效。
以下是servlet的代码:
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
BufferedReader reader = request.getReader();
myData data = mapper.readValue(reader, myData.class);
List<City> cities = data.getCities();
String filename = domain+".csv";
response.setContentType("application/csv");
response.setHeader("content-disposition","filename="+filename);
PrintWriter out = response.getWriter();
/*writes csv rows to out stream*/
for (int i = 0; i <= 50; i++) {
String nome = cities.get(i).getName();
List<FBHit> results = allQueries.get(nome).get();
for (FBHit hit : results) {
hit.writeToCSV(out, nome);
}
}
out.close();
}
这是异步请求的代码:
$.ajax({
url: "/socialpa-2/batchQueryServlet",
contentType: 'application/json',
data: json,
Accept: "text/csv",
success: function(data, textStatus, jqXHR) {
alert(data);
},
type: "POST"
});
请求返回时,文件内容显示在警报中,但不会触发下载。如果我删除警报也没有任何反应。我怀疑该错误是接受的错误值或使用printwriter。
这是CSV文件的示例,我看起来没问题
"Alassio","http://facebook.com/-1089066187","Città di Alassio",2644
"Albenga","http://facebook.com/-915266586","Comune di Albenga",100
"Albisola Superiore","http://facebook.com/2031157506","Città di Albisola Superiore",536
"Albissola Marina","http://facebook.com/80387060","Comune di Albissola Marina",597
"Bardineto","http://facebook.com/-317945148","Comune di Bardineto",360
"Bergeggi","http://facebook.com/92600835","Comune di Bergeggi",1214
"Cairo Montenotte","http://facebook.com/1413890265","Città di Cairo Montenotte",206
我应该坚持使用java(因为我不是服务器的所有者),如果可能的话,我宁愿不在服务器上写一个文件。
答案 0 :(得分:1)
出于安全原因,Java脚本无法将文件保存到用户的计算机,因此无法将从AJAX请求接收的字节写入文件系统。但是,您可以使用JavaScript使浏览器使用
启动文件下载window.location = "<your path goes here>"
但这将执行GET请求。
你也可以通过javascript生成一个带有POST方法和提交按钮的表单,然后以编程方式提交表单,但这可能超过顶部。