ユーザーが「ダウンロード」ボタンをクリックすると、ファイルのダウンロードを開始するコントローラーメソッドがあります。オブジェクトリストには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を増やすか、レスポンスヘッダーに書き込むデータを少なくします。
サーブレット設定ファイルを変更せずに問題を解決できますか?この問題を解決する他の方法はありますか?私は次の操作を実行するファイルをダウンロードするために
サーブレットコンテナのヘッダーサイズを増やす必要があります。 Tomcatでは、これはserver.xmlファイル –
で行われます。@AngeloImmediataは私のチームプログラムの他の部分に影響を与えますか?私は設定を変更するのが怖いです。 maxHttpHeaderSizeにどの値を設定する必要がありますか? – HelloWorld
チームに何も変更しないでください。このプロパティはサーブレットコンテナにヘッダ次元を増やすよう伝えるだけです。彼の価値については、あなたのシナリオによって決まります。私は5MBで十分だろうと思う。 –