Java 通过浏览器传递csv文件时出错

Java 通过浏览器传递csv文件时出错,java,csv,playframework,download,playframework-1.x,Java,Csv,Playframework,Download,Playframework 1.x,我的应用程序正在做的是创建一个大的csv文件(它是一个报告),其思想是交付csv文件的内容,而不实际为其保存文件。这是我的密码 String csvData; //this is the string that contains the csv contents byte[] csvContents = csvData.getBytes(); response.contentType = "text/csv"; response.headers.put("Content-Disposition"

我的应用程序正在做的是创建一个大的csv文件(它是一个报告),其思想是交付csv文件的内容,而不实际为其保存文件。这是我的密码

String csvData; //this is the string that contains the csv contents
byte[] csvContents = csvData.getBytes();
response.contentType = "text/csv";
response.headers.put("Content-Disposition", new Header(
            "Content-Disposition", "attachment;" + "test.csv"));
response.headers.put("Cache-Control", new Header("Cache-Control",
            "max-age=0"));
response.out.write(csvContents);
ok();
正在生成的csv文件相当大,我得到的错误是

org.jboss.netty.handler.codec.frame.TooLongFrameException:HTTP线大于4096字节。

克服这个问题的最好方法是什么

我的技术堆栈是java 6,带有play framework 1.2.5

注意:响应对象的来源是play.mvc.Controller.response

请使用

ServletOutputStream


我们使用它直接在浏览器中显示操作的结果

window.location='data:text/csv;charset=utf8,' + encodeURIComponent(your-csv-data);
我不确定内存不足错误,但我至少会尝试以下方法:

request.format = "csv";
renderBinary(new ByteArrayInputStream(csvContents));

显然,netty抱怨http头太长——也许它认为您的文件是头的一部分,另请参阅

正如nylund所说,使用renderBinary应该可以做到这一点

我们使用writeChunk oursleves动态输出大型报告,如:

控制器:

public static void getReport() {

        final Report report = new Report(code, from, to );
        try {

            while (report.hasMoreData()) {
                final String data = await(report.getData());
                response.writeChunk(data);
            }
        } catch (final Exception e) {
            final Throwable cause = e.getCause();
            if (cause != null && cause.getMessage().contains("HTTP output stream closed")) {
                logger.warn(e, "user cancelled download");
            } else {
                logger.error(e, "error retrieving  data");
            }
        }
    }
报告内代码

 public  class Report {
    public Report(final String code, final Date from, final Date to) {
    }
    public boolean hasMoreData() {
        // find out if there is more data        
    }
    public Future<String> getData() {
        final Job<String> queryJob = new Job<String>() {
            @Override
            public String doJobWithResult() throws Exception {
               // grab data (e.g read form db) and return it               
                return data;
            }
        };
        return queryJob.now();
    }
}
公共类报告{
公共报告(最终字符串代码、最终日期从、最终日期到){
}
公共布尔值hasMoreData(){
//了解是否有更多数据
}
公共未来获取数据(){
最终作业查询作业=新作业(){
@凌驾
公共字符串doJobWithResult()引发异常{
//抓取数据(如读取表单数据库)并返回
返回数据;
}
};
返回queryJob.now();
}
}

您在第一个headernope中丢失了
filename=
,不是这样的,添加后仍然是相同的错误。我不是说这是导致错误的问题。只是注意到了一些其他的错误。
 public  class Report {
    public Report(final String code, final Date from, final Date to) {
    }
    public boolean hasMoreData() {
        // find out if there is more data        
    }
    public Future<String> getData() {
        final Job<String> queryJob = new Job<String>() {
            @Override
            public String doJobWithResult() throws Exception {
               // grab data (e.g read form db) and return it               
                return data;
            }
        };
        return queryJob.now();
    }
}