Экспорт CSV-файла в браузере - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь экспортировать CSV-файл из браузера. Итак, поток следующий. Когда я в GUI нажимаю на кнопку экспорта, он должен создать CSV-файл в бэкэнде и показать его мне в браузере (как загружено). Но это не случилось. Когда я нажимаю на кнопку, он вызывает мой метод из бэкэнда, создает файл CSV и сохраняет его в папке, но он не показывает мне этот файл в браузере.

Вот мой код:

public void export(HttpServletResponse response) throws IOException {       
    try {
        // create FileWriter object with file as parameter 
        FileWriter outputfile = new FileWriter("exported.csv"); 

        // create CSVWriter object filewriter object as parameter 
        CSVWriter writer = new CSVWriter(outputfile); 

        // create a List which contains String array 
        List<String[]> data = new ArrayList<String[]>(); 
        data.add(new String[] { "Name", "Class", "Marks" }); 
        data.add(new String[] { "Aman", "10", "620" }); 
        data.add(new String[] { "Suraj", "10", "630" }); 
        writer.writeAll(data); 

        // closing writer connection 
        writer.close(); 
        response.setContentType("application/ms-excel"); // or you can use text/csv
        response.setHeader("Content-Disposition", "attachment; filename=exported.csv"); 
    } 
    catch (IOException e) { 
       e.printStackTrace(); 
    } 
}

EDIT:

угловая часть:

.service('ExportService', function($http) {
        this.export = function() {
            return $http.post('/data/export', { responseType: 'application/octet-stream' });
        };
    })

$scope.export = function() {
    ExportService.export()
        .success(function(data, status, headers, config) {
            var blob = new Blob([data], { type: 'application/octet-stream' });
            saveAs(blob, 'Exported  - exported.csv');
            $.growl({ message: '<br>successfully exported', title: '<b>SUCCESS</b>' }, { type: 'success' });
                })
        .error(function(data, status, headers, config) {
            $.growl({ message: '<br>Exporting failed', title: '<b>ERROR</b>' }, { type: 'danger' });
            });
    }

Кто-нибудь знает, в чем может быть проблема?

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

Вы никогда не отправляете файл клиенту. Вам даже не нужно сначала записывать данные в файл на вашем сервере. Просто используйте OutputStreamWriter:

public void export(HttpServletResponse response) throws IOException {
    try (CSVWriter writer = new CSVWriter(new OutputStreamWriter(response.getOutputStream(), StandardCharsets.UTF_8)) {
        response.setContentType("text/csv");
        response.setHeader("Content-Disposition", "attachment; filename=exported.csv");

        List<String[]> data = new ArrayList<String[]>();

        data.add(new String[] { "Name", "Class", "Marks" });
        data.add(new String[] { "Aman", "10", "620" });
        data.add(new String[] { "Suraj", "10", "630" });

        writer.writeAll(data);
    }
}

Кстати: я заменил блок try на блок try-with-resources. Таким образом вы убедитесь, что метод close() писателя вызывается всегда, даже если было исключение. Кроме того, нет необходимости перехватывать исключение в этом месте, так как вызывающие метод должны обрабатывать IOException s в любом случае.

0 голосов
/ 13 мая 2019

Вы записываете свои данные в файл с именем exported.csv локально на сервере. Этот файл не отправляется клиенту.

Вместо этого вы должны записать содержимое файла в response.getOutputStream().

...