Java servlet生成的文件未下载

Java servlet生成的文件未下载,java,html,post,attachment,content-disposition,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.getWr

我有一个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更改为相应的操作(例如),并且不显示另存为对话框。我已经检查了Chrome中的响应标题,它看起来像这样(经过编辑,现在显示完整的“未解析”标题):

..“响应”选项卡显示我正在向响应写入的内容


我几乎不知所措,因为我看过的所有例子都是这样成功的。

在你的例子中,内容类型和编码被交换了。应该是

response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("UTF-8");
不确定如何取回
内容类型:application/vnd.ms-excel;但响应中的字符集=UTF-8

编辑:


此外,CSV文件的正确MIME类型是
text/CSV
,而不是
application/vnd.ms excel
——这是用于
*.xls
文件的MIME类型。

在jQuery mobile中,表单默认情况下由Ajax处理,使用数据Ajax=“false”解决了问题,例如

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


有点让人吃惊,这里:-)

为了可读性,我用实际值替换了常量。不幸的是,我交换了它们;编辑的问题现在是正确的。更改为text/csv没有任何区别,application/x-unknown也没有任何区别。@davenotage请发布完整的响应以及所有标题,如Julian Reschke suggested请发布浏览器收到的完整响应。可能发生了重定向?你说的“完全响应”是指Chrome开发者工具窗口中“响应”选项卡中的内容吗?这只是将CSV写入响应。我已经编辑了这个问题以显示“未解析”响应标头。请求URI是什么,您所说的“对应操作”是什么意思?操作表示表单中的操作属性,例如,因此请求URI最终为,例如:。此后,我使用另一个独立于应用程序(它是JSP/jQuery Mobile的组合)的单独页面设置了一个测试工具,并且可以正常工作,因此它似乎受到页面结构的影响。我真的不明白为什么
<form id="myform" action="../filedownload" method="POST" data-ajax="false">