Действие контроллера генерирует содержимое CSV и возвращает его с заголовком Content-Disposition: attachment; filename=file.csv
@GetMapping("/csv")
public void csvEmissions(HttpServletResponse response) {
try {
ColumnPositionMappingStrategy<CsvRow> mapStrategy
= new ColumnPositionMappingStrategy<>();
mapStrategy.setType(CsvRow.class);
String[] columns = new String[]{
"col1",
"col2"
};
mapStrategy.setColumnMapping(columns);
CSVWriter csvWriter = new CSVWriter(response.getWriter());
StatefulBeanToCsv<CsvRow> btcsv = new StatefulBeanToCsvBuilder<CsvRow>(response.getWriter())
.withMappingStrategy(mapStrategy)
.withSeparator(',')
.build();
btcsv.write(csvrows());
response.setContentType("text/csv");
response.setHeader("Content-Disposition", "attachment; filename=file.csv");
csvWriter.close();
} catch (IOException | CsvRequiredFieldEmptyException | CsvDataTypeMismatchException e) {
throw new RuntimeException(e.getMessage());
}
}
все работает нормально, если метод csvrows()
возвращает не так много CsvRow
. Файл корректно загружается браузером.
Когда количество строк больше (скажем, более 200), оно отбрасывает заголовок Content-Type
и Content-Disposition
, и браузер печатает вывод CSV в виде текста в браузере.
В ответе присутствует только заголовок Transfer-Encoding: chunked
.
Есть предложения, как сделать его загружаемым для большого объема данных?