2

编辑

根据我所了解到的(来自 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

POSTfirebug 中的选项卡以正确的 csv 格式显示正确的数据。要使用 csv 样式格式化数据,我使用dojox/grid/enhanced/plugins/exporter/CSVWriter

4

1 回答 1

3

我认为不可能从 Ajax 请求中下载文件,请参阅这个问题:Allow User to Download File using Ajax

您应该按照问题中的建议使用 iframe,或者使用包含您的数据的标准 HTML 表单,并在此表单上发帖。

于 2012-08-23T14:09:36.643 回答