繁体   English   中英

通过Spring MVC Controller下载大文件

[英]Download large file through spring mvc controller

我有一种控制器方法,一旦用户单击“下载”按钮,该方法便开始下载文件。 对象列表最多可以包含40万个对象。当我将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或更多时,它就可以了。 给我一个错误:

执行控制器时发生错误{org.apache.coyote.http11.HeadersTooLargeException:试图将更多数据写入响应标头,而缓冲区中没有可用空间。 增加连接器上的maxHttpHeaderSize或将较少的数据写入响应标头。

是否可以在不修改servlet配置文件的情况下解决问题? 还有其他方法可以解决此问题吗?

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

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

为了做到这一点,我将编写这种控制器:

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

通过使用这种控制器,我能够下载非常大的文件

安杰洛

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM