【问题标题】:Error when creating CSV-File with JSP (Tomcat 7/Java)使用 JSP (Tomcat 7/Java) 创建 CSV 文件时出错
【发布时间】:2014-07-29 13:02:16
【问题描述】:

我有一个 JSP 文件,它创建一个 CSV 文件。

为了告诉服务器该文件是 CSV 文件,我在 JSP 中添加了以下代码:

response.setContentType ("application/csv");
response.setHeader("Content-Disposition", "attachment;filename=test.csv"); 

在文件中,我只是用“Writer”对象(输出变量)写入文件的内容。 因此我使用以下代码生成文件:

out.write("test1;test2;etc");

这个 csv 文件大约有 16 列,大约 3000 行。

我遇到的问题是“下载文件”对话框没有出现更大的文件。当我只有 128 行时,它可以工作,并且浏览器确实显示“下载文件”-windows。当我有 129 行时,浏览器只需用纯文本打开文件(IE 忽略换行符)。这发生在我测试的每个浏览器(IE 11 和 Firefox)中。我实际上不知道为什么会发生这种情况,尽管我的猜测是它与 Writer-Object 有关。我已经尝试过“flush()” Writer,但这并没有改变任何东西。

提前致谢!

编辑: 我确实将代码简化为以下内容。当 j 限制为 50 时,它确实有效。随着被设置为100,它没有。 .jsp 使用 href.location 或 window.open() 打开(似乎没有区别)

<%
    int j = 0;
    int k = 0;

    for (j = 0; j < 100; j++)
    {

        out.write(";");

        for (k = 0; k < 16; k++)
        {
            out.write(j + "TEST");

            if (k != 15)
            {
                out.write(";");
            }
        }

        out.write("\r\n");
    }


    response.setContentType ("application/csv");
    response.setHeader("Content-Disposition", "attachment;filename=test.csv"); 
%>

【问题讨论】:

  • 有什么错误吗?你检查过堆栈跟踪吗?
  • Tomcat 不返回任何错误。老实说,我什至不确定这是 Tomcat/Java 还是浏览器的问题。
  • 如何尝试response.setContentLength(&lt;file-size&gt;)
  • 是的,我试过了。它没有改变任何东西。
  • 是否有文件的最大大小或帽子之类的东西?我确实尝试将 Content Length 设置为非常大的大小,这比实际创建的内容要大得多。

标签: java jsp csv tomcat7


【解决方案1】:

在您的tomcat webapps/manager/WEB-INF/web.xml 中更改以下配置。 我们可以更改此设置,只需在每个大小限制上设置 0。 最后配置:

  <multipart-config>
       <!-- 50MB max -->
       <max-file-size>524288000</max-file-size>
        <max-request-size>524288000</max-request-size>
        <file-size-threshold>0</file-size-threshold>
     </multipart-config>

同时检查 ,

ma​​xPostSize

POST 的最大字节大小,将由容器FORM URL 参数解析处理。可以通过将此属性设置为小于或等于 0 的值来禁用限制。如果未指定,则将此属性设置为 2097152 (2 megabytes)

另一个限制是:

maxHttpHeaderSize 请求和响应 HTTP 标头的最大大小,以字节为单位。如果未指定,则将此属性设置为4096 (4 KB)

您可以在其中找到它们

$TOMCAT_HOME/conf/server.xml

【讨论】:

  • 我尝试在 server.xml 中编辑连接器: 并将您的代码添加到 web.xml。一旦达到大量行,csv 文件仍会在浏览器中以纯文本形式打开。
  • 遗憾的是它没有。让我感到困惑的是,纯文本中似乎没有缺少一行。唯一的“错误”是“保存文件”对话框不再出现,这是必需的。
【解决方案2】:

Jsp 非常适合生成 HTML 输出。

由于您要生成 csv,您最好使用 servlet。我做到了,它适用于 50000 行。这是我的演示代码:

public class CsvServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest hsr, HttpServletResponse response) throws ServletException, IOException {
        response.setStatus(HttpServletResponse.SC_OK);
        response.setHeader("Content-Disposition", "attachment;filename=test.csv");
        response.setContentType ("application/csv");
        PrintWriter pw = response.getWriter();
        for (int i=0; i<50000; i++) {
            pw.print(i);
            for (char c: "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray()) {
                pw.print(',');
                pw.print(c);
            }
            pw.println();
        }
    }

}

【讨论】:

    猜你喜欢
    • 2019-10-18
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多