使用JSP创建CSV文件时出错(Tomcat 7 / Java)

时间:2014-07-29 13:02:16

标签: java jsp csv tomcat7

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

告诉服务器该文件是CSV文件我将以下代码添加到JSP:

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

在文件中,我只使用“Writer”对象(out-Variable)编写文件的内容。 因此,我使用以下代码来生成文件:

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

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

我遇到的问题是“下载文件”-Dialog不会出现更大的文件。当我只有128行时,它可以工作,浏览器确实显示“下载文件” - 窗口。当我有129行时,浏览器只需用纯文本打开文件(IE忽略换行符)。这种情况发生在我测试的每个浏览器中(IE 11和Firefox)。我实际上不知道为什么会发生这种情况,尽管我的猜测是它与Writer-Object有关。我已经尝试“刷新()”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"); 
%>

2 个答案:

答案 0 :(得分:0)

更改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>

同时检查,

<强> maxPostSize

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

另一个限制是:

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

您可以在

中找到它们
$TOMCAT_HOME/conf/server.xml

答案 1 :(得分:0)

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();
        }
    }

}