Конвертация text/csv в blob [Angular 7/Java]

94
13 августа 2019, 23:10

Всем привет!

Пытаюсь сконвентировать text/csv в blob, чтобы пользователь имел возможность скачать csv файл по кнопке.

Чем располагаю: Есть API (Java 8 с RESTEasy), при обращении к одному из POST методов, на выходе возвращается text/csv :

Есть веб клиент на Angular 7 и речь пойдет о проблеме в нем... При нажатии на кнопку срабатывает следующий код:

 exportSourceTableToCsv() {
  this.api.postExportToCsv(this.tableSource.toTable())
  .toPromise()
  .then(res => this.saveFile(res));
 }
 public postExportToCsv(table: Table): Observable<any> {
 return this.httpClient.post<any>( apiConfig.EXPORT_TO_CSV, table);
 }
 saveFile(response) {
 //Вот тут я так понимаю проблемное место
 const blob = new Blob([response._body], { type: 'text/csv' });
 saveAs(blob, "table.csv"); //Плагин file-saver из npm для сохранения файлов.
 }

При вызове последнего метода выводится ошибка:

ERROR Error: Uncaught (in promise): HttpErrorResponse: {"headers":{"normalizedNames":{},"lazyUpdate":null},"status":200,"statusText":"OK","url":"http://localhost:4200/table/export","ok":false,"name":"HttpErrorResponse","message":"Http failure during parsing for http://localhost:4200/table/export","error":{"error":{},"text":"1;2;33\r\n23;23;33\r\n213;321;33\r\n123;3;33\r\n213;123;33\r\n"}}
at resolvePromise (zone.js:831)
at resolvePromise (zone.js:788)
at zone.js:892
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
at Object.onInvokeTask (core.js:17280)
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:422)
at Zone.push../node_modules/zone.js/dist/zone.js.Zone.runTask (zone.js:195)
at drainMicroTaskQueue (zone.js:601)
at ZoneTask.push../node_modules/zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (zone.js:502)
at invokeTask (zone.js:1744)

Как это можно исправить? Видел много примеров именно с таким же подходом, должно работать

Пробовал указывать явно charset и еще text в качестве типа источника при создании Blob - не помогло. Тип возвращаемого значения для метода в API мне не сильно принципиален, но хотелось бы использовать предназначенный для передачи CSV - text/csv

Спасибо!

Answer 1

Примерно так:

return this.httpClient
  .post<any>( apiConfig.EXPORT_TO_CSV, table, 
    {
      headers: new HttpHeaders({ 'Content-Type': 'text/csv' }),
      observe: 'response',
      responseType: 'blob'
    })
  .subscribe(file => saveAs(file, "table.csv"));
READ ALSO
Не проходит тест на Google Play &ldquo; Split config.х86/armeabi_v7a was defined multiple times&rdquo;

Не проходит тест на Google Play “ Split config.х86/armeabi_v7a was defined multiple times”

Создал новое обновление, но оно не прошло тесты на google playc сообщением:

98
SQL запрос по списку параметров (Spring Data)

SQL запрос по списку параметров (Spring Data)

Необходимо найти в БД (Postgres) всех юзеров или операторов (role) по списку регионов (List regions)

129
Валидация аргументов командной строки JAVA

Валидация аргументов командной строки JAVA

Разрабатывается приложение командной строки, где строка следующего вида --file=dbtxt add --name=John --surname=Doe --age=27 --email=john@gmail

170
Jamod, детектировать изменение processImage \ детектировать наличие обмена

Jamod, детектировать изменение processImage \ детектировать наличие обмена

Создан Slave TCP Modbus при помощи библиотеки Jamod (пробовал так же j2mod с тем же результатом) согласно документацииРаботает, обмен идет, но есть пара...

97