从jquery.ajax()中的Java HttpServlet接受CSV附件

时间:2013-05-22 15:28:01

标签: jquery servlets csv download

在我的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(因为我不是服务器的所有者),如果可能的话,我宁愿不在服务器上写一个文件。

1 个答案:

答案 0 :(得分:1)

出于安全原因,Java脚本无法将文件保存到用户的计算机,因此无法将从AJAX请求接收的字节写入文件系统。但是,您可以使用JavaScript使浏览器使用

启动文件下载
window.location = "<your path goes here>"

但这将执行GET请求。

你也可以通过javascript生成一个带有POST方法和提交按钮的表单,然后以编程方式提交表单,但这可能超过顶部。