Я пытаюсь преобразовать текст / csv в blob, чтобы пользователь мог загрузить файл csv, нажав кнопку.
Что у меня есть:
Существует API (Java 8 с RESTEasy), при доступе к одному из методов POST текст / csv возвращается на выходе:
Этот метод в Java API:
@POST
@Path("/export")
@Consumes("application/json")
@Produces("text/csv")
public Response exportToCsv(Table table)
{
InputStream temp = table.exportToCsv(";");
StreamingOutput res = new StreamingOutput() {
@Override
public void write(OutputStream output) throws IOException, WebApplicationException {
IOUtils.copy(temp, output);
temp.close();
output.close();
}
};
return Response.ok().encoding("utf-8").entity(res).build();
}
На Angular 7 есть веб-клиент, и мы обсудим в нем проблему ...
Нажатие на кнопку запускает следующий код (в моем компоненте APP) .ts:
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) {
// Here I understand the problem place
const blob = new Blob ([response._body], {type: 'text/csv'});
saveAs (blob, "table.csv"); // File-saver plugin from npm to save files.
}
При вызове последнего метода отображается ошибка:
ERROR Error: Uncaught (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)

Как я могу это исправить? Я видел много примеров с точно таким же подходом, должно работать
Я пытался явно указать кодировку, а также текст в качестве типа источника при создании Blob - не помогло. Тип возвращаемого значения для метода в API не очень важен для меня, но я бы хотел использовать текст / csv
Спасибо!