gpt4 book ai didi

java - 通过spring mvc Controller 下载大文件

转载 作者:行者123 更新时间:2023-12-01 08:45:25 32 4
gpt4 key购买 nike

我有 Controller 方法,一旦用户单击“下载”按钮就开始下载文件。对象列表可以包含最多 400 000 个的大量对象。当我放入 csv 文件中少量对象时 - 它工作正常。

@RequestMapping(value = "/downloadCSV")
public void downloadCSV(HttpServletResponse response) throws IOException
{

response.setContentType("text/csv");
String reportName = "metrics.csv";
response.setHeader("Content-disposition", "attachment;filename="+reportName);

ArrayList<String> rows = new ArrayList<String>();
rows.add("A, B, C, D, E");
rows.add("\n");

for (int i = 0; i < someList.size(); i++) {
String row = metricsDownloadModelList.get(i).getContentId()
+ someList.get(i).getA() + ", "
+ someList.get(i).getB() + ", "
+ someList.get(i).getC() + ", "
+ someList.get(i).getD() + ", "
+ someList.get(i).getE()
+ "\n";
rows.add(row);
}

Iterator<String> iter = rows.iterator();
while (iter.hasNext()) {
String outputString = (String) iter.next();
response.getOutputStream().print(outputString);
}

response.getOutputStream().flush();

}

但是当我将列表中的对象数量增加到 1000 或更多时,它。给我一个错误:

执行 Controller 时出错 { org.apache.coyote.http11.HeadersTooLargeException: 尝试向响应 header 写入的数据多于缓冲区中的可用空间。增加连接器上的 maxHttpHeaderSize 或在响应 header 中写入更少的数据。

我可以在不修改 servlet 配置文件的情况下解决我的问题吗?有没有其他方法可以解决这个问题?

最佳答案

为了下载该文件,我将执行以下操作:

  • 创建临时 CSV 文件
  • 下载文件

为了做到这一点,我会编写这种 Controller :

@RequestMapping(method = { RequestMethod.GET }, value = { "/downloadCsv" })
public ResponseEntity<InputStreamResource> downloadCSV()
{
try
{
String fileName = "test.csv";
//Create here your CSV file
File theCsv = new File(fileName);
HttpHeaders respHeaders = new HttpHeaders();
MediaType mediaType = new MediaType("text","csv");
respHeaders.setContentType(mediaType);
respHeaders.setContentDispositionFormData("attachment", fileName);
InputStreamResource isr = new InputStreamResource(new FileInputStream(theCsv));
return new ResponseEntity<InputStreamResource>(isr, respHeaders, HttpStatus.OK);
}
catch (Exception e)
{
String messagge = "Error in CSV creation; "+e.getMessage();
logger.error(messagge, e);
return new ResponseEntity<InputStreamResource>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}

通过使用这种 Controller ,我可以下载非常大的文件

安杰洛

关于java - 通过spring mvc Controller 下载大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45985929/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com