Конвертировать текстовый / CSV-файл в блоб [Angular 7 / Java] - PullRequest
0 голосов
/ 17 января 2019

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

Что у меня есть: Существует API (Java 8 с RESTEasy), при доступе к одному из методов POST текст / csv возвращается на выходе: Postman response headers Postman response body Этот метод в 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)

Response in Postman from the api:

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

Спасибо!

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