簡體   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