servlet生成的文件未下载

时间:2014-07-15 00:27:29

标签: java html post attachment content-disposition

我有一个servlet,其动作可以根据表单中POST传递的参数生成CSV文件。 servlet代码片段如下所示:

response.setContentType("text/csv");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition","attachment; filename=" + filename);
PrintWriter pw = response.getWriter();
pw.println(content); // content is some CSV in a string
pw.close();

浏览器(包括FF和Chrome)似乎忽略了附件指示符,因为它将URL更改为相应的操作(例如http://myserver.com/filedownload),并且不显示“另存为”对话框。我已经检查了Chrome中的响应标头,它看起来像这样(编辑后现在显示完整的“未解析”标题):

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Disposition: attachment; filename=JobTracking.csv
Content-Type: text/csv;charset=UTF-8
Content-Length: 16876
Date: Tue, 15 Jul 2014 22:32:49 GMT

..并且“响应”选项卡显示我正在写回复的内容。

我接近我的智慧结束,因为我所看到的所有例子都成功地做到了这一点。

2 个答案:

答案 0 :(得分:1)

您的示例中有内容类型和编码交换。它应该是

response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("UTF-8");

但不确定如何在回复中找回Content-Type:application/vnd.ms-excel;charset=UTF-8

修改

此外,CSV文件的正确MIME类型为text/csv而非application/vnd.ms-excel - 此类型适用于*.xls个文件。

答案 1 :(得分:0)

在jQuery mobile中,表单默认由Ajax处理,使用data-ajax =“false”解决了问题,例如

<form id="myform" action="../filedownload" method="POST" data-ajax="false">

有点头脑发热的时刻,那里: - )