【问题标题】:File generated by servlet not downloadingservlet生成的文件不下载
【发布时间】:2014-09-05 01:19:48
【问题描述】:

我有一个 servlet,它有一个动作,它根据表单的 POST 中传递的参数生成一个 CSV 文件。 servlet 代码 sn-p 如下所示:

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

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

我已经接近我的智慧了,因为我看过的所有示例都成功地做到了这一点。

【问题讨论】:

  • 请发布浏览器收到的完整响应。也许发生了重定向?
  • “完整响应”是指 Chrome 开发者工具窗口中的“响应”选项卡中的内容吗?这只是将 CSV 写入响应。我已经编辑了问题以显示“未解析”的响应标头。
  • 什么是请求URI,“对应的动作”是什么意思?
  • Action 表示表单中的 action 属性是什么,例如
    ,所以请求 URI 最终是,例如:myserver.com/filedownload。我已经使用另一个独立于应用程序的单独页面设置了一个测试工具(它是 JSP/jQuery Mobile 的组合),并且可以正常工作,因此它似乎受到页面结构的影响。严重击败我为什么,虽然

标签: java html post attachment content-disposition


【解决方案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 文件的类型。

【讨论】:

  • 为了可读性,我用实际值替换了常量。不幸的是,我交换了它们;编辑的问题现在是正确的。更改为 text/csv 没有任何区别,application/x-unknown 或其他任何内容也一样。
  • @DaveNottage 请发布完整的回复以及 Julian Reschke 建议的所有标题
【解决方案2】:

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

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

有点让人头疼的时刻,那里:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    相关资源
    最近更新 更多