2017-08-31 17 views
0

ユーザーが「ダウンロード」ボタンをクリックすると、ファイルのダウンロードを開始するコントローラーメソッドがあります。オブジェクトリストには400,000までの大量のオブジェクトを入れることができます。オブジェクトを少量のCSVファイルに置くと、正常に動作します。大きなファイルをspring mvcコントローラーからダウンロード

@RequestMapping(value = "/downloadCSV") 
 
\t public void downloadCSV(HttpServletResponse response) throws IOException 
 
\t { 
 
\t 
 
\t \t response.setContentType("text/csv"); 
 
\t \t String reportName = "metrics.csv"; 
 
\t \t response.setHeader("Content-disposition", "attachment;filename="+reportName); 
 
    
 
\t \t ArrayList<String> rows = new ArrayList<String>(); 
 
\t \t rows.add("A, B, C, D, E"); 
 
\t \t rows.add("\n"); 
 
    
 
\t \t for (int i = 0; i < someList.size(); i++) { 
 
\t \t \t String row = metricsDownloadModelList.get(i).getContentId() 
 
\t \t \t \t \t + someList.get(i).getA() + ", " 
 
\t \t \t \t \t + someList.get(i).getB() + ", " 
 
\t \t \t \t \t + someList.get(i).getC() + ", " 
 
\t \t \t \t \t + someList.get(i).getD() + ", " 
 
\t \t \t \t \t + someList.get(i).getE() 
 
\t \t \t \t \t + "\n"; 
 
\t \t \t rows.add(row); 
 
\t \t } 
 
    
 
\t \t Iterator<String> iter = rows.iterator(); 
 
\t \t while (iter.hasNext()) { 
 
\t \t \t String outputString = (String) iter.next(); 
 
\t \t \t response.getOutputStream().print(outputString); 
 
\t \t } 
 
    
 
\t \t response.getOutputStream().flush(); 
 

 
\t }

しかし、ときに私はそれは、1000年以上に、リスト内のオブジェクトの数を増やしています。

コントローラーの実行中にエラーが発生しました{org.apache.coyote.http11.HeadersTooLargeException:バッファーで使用可能な空き容量よりも多くのデータを応答ヘッダーに書き込もうとしました。コネクタ上でmaxHttpHeaderSizeを増やすか、レスポンスヘッダーに書き込むデータを少なくします。

サーブレット設定ファイルを変更せずに問題を解決できますか?この問題を解決する他の方法はありますか?私は次の操作を実行するファイルをダウンロードするために

+0

サーブレットコンテナのヘッダーサイズを増やす必要があります。 Tomcatでは、これはserver.xmlファイル –

+0

で行われます。@AngeloImmediataは私のチームプログラムの他の部分に影響を与えますか?私は設定を変更するのが怖いです。 maxHttpHeaderSizeにどの値を設定する必要がありますか? – HelloWorld

+0

チームに何も変更しないでください。このプロパティはサーブレットコンテナにヘッダ次元を増やすよう伝えるだけです。彼の価値については、あなたのシナリオによって決まります。私は5MBで十分だろうと思う。 –

答えて

0

  • 一時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); 
    } 
} 

この種類のコントローラを使用すると、非常にh ugeファイル

アンジェロ

関連する問題