大家好!
我正在尝试将 text/csv 转换为 blob,以便用户可以通过单击按钮下载 csv 文件。
我所拥有的:有一个 API(带有 RESTEasy 的 Java 8),当访问其中一种 POST 方法时,在输出中返回 text/csv:
Angular 7 上有一个 Web 客户端,我们将讨论其中的问题......当您单击按钮时,以下代码将起作用:
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)
如何解决这个问题?我看到了许多具有完全相同方法的示例,它应该可以工作
在创建 Blob 时,我尝试明确指定字符集和文本作为源类型 - 它没有帮助。API中方法的返回类型对我来说不是很重要,但我想使用用于传输的CSV - text/csv
谢谢!
或多或少是这样的: