我有一个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
. ."响应"选项卡显示了我写到响应的内容。
我几乎要绞尽脑汁了,因为几乎所有我看过的例子都成功地做到了这一点。
您在示例中交换了内容类型和编码。应该是
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
文件。
在移动版jQuery中,表单默认由Ajax处理,使用data-ajax="false"解决了这个问题,例如
<form id="myform" action="../filedownload" method="POST" data-ajax="false">
有点拍头的时刻:-)