Загрузка файла Excel в Angular Client (Angular v5.2), полученный в ответ от WebAPI - PullRequest
0 голосов
/ 03 мая 2018

У меня есть следующий сервис, который позволяет мне скачивать файл, используя http Get

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import { saveAs } from 'file-saver';

@Injectable()
export class FileService {

  blob: Blob;
  url: string;

  constructor(private _http: Http) { }

  uploadFile(file: File, filetype: string) {
    console.log('uploading...');
    const endpoint = 'http://localhost:60994/api/file';
    const formData:  FormData = new FormData();
    formData.append(filetype, file, file.name);
    return this._http.post(endpoint, formData);
  }

  getFile() {
    return this._http.get('http://localhost:60994/api/file')
    .subscribe(data => {
      if (data != null)
      {
        this.blob = new Blob([data._body], { type: 'application/vnd.ms-excel' });
        const file = new File([this.blob], 'report.xlsx', { type: 'application/vnd.ms-excel' });
        console.log(this.blob);
        console.log(file);
        this.url = window.URL.createObjectURL(file);
        window.open(this.url);
      }
    });
  }
}

Файл (xlsx, xls) при загрузке в основном поврежден без данных (Файл, отправленный сервером, содержит данные, и я сам проверил это). Также

console.log(this.blob);

и

console.log(file); 

показать файл с почти точным размером файла, ожидаемым от сервера (в консоли chrome).

Лучшее предположение, которое я выдвинул, заключается в том, что я ошибаюсь при восстановлении полученного файла.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Оказывается, я использовал неправильный импорт (Http) для HTTP GET.

импортировано import { HttpClient } from '@angular/common/http'; и изменено

 getFile() {
        return this._http.get('http://localhost:60994/api/file',{responseType: 'blob'})
        .subscribe(data => saveAs(data));
      }
0 голосов
/ 04 мая 2018

Ваш запрос http GET, скорее всего, требует, чтобы некоторые параметры указывали на то, что вы заинтересованы в необработанных байтах ответа:

this._http.get(url, {responseType: 'blob'}).subscribe(..)

Я не уверен, какой текущий ваш 'TRIAL_PRICE' аргумент для вызова, но это определенно не тот аргумент, который ожидает HTTP-клиент angular5:

При вызове с типом responseType, равным blob, вы также получите объект Blob в качестве наблюдаемой полезной нагрузки, поэтому вам также не понадобится логика преобразования тела.

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