весенняя загрузка - генерация больших csv-файлов, отбрасывающих заголовки Content-Type и Content-Disposition - PullRequest
1 голос
/ 28 февраля 2020

Действие контроллера генерирует содержимое 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.

Есть предложения, как сделать его загружаемым для большого объема данных?

1 Ответ

2 голосов
/ 28 февраля 2020

Заголовок Content-Length отсутствует в вашем ответе, поэтому большой контент извлекается в чанки и браузер выводится на вкладку.

Чтобы получить длину контента, попробуйте сохранить данные CSV во временный файл, прежде чем отправлять его в ответ. , Также установите заголовки перед записью данных в средство записи ответов.

File file = createTempCSVFile();

response.setContentType("text/csv");
response.setContentLength((int)file.length());
response.setHeader("Content-Disposition", "attachment; filename=file.csv");

// write file data to response.getWriter();

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...