Java 通过浏览器传递csv文件时出错
我的应用程序正在做的是创建一个大的csv文件(它是一个报告),其思想是交付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"
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();
}
}