Angular не сохраняет файл из байтового массива с помощью FileSaver - PullRequest
0 голосов
/ 10 апреля 2019

В моем веб-интерфейсе API есть служба, которая возвращает файл в виде байтового массива:

[HttpPost]
[Route("api/downloadFiles")]
public HttpResponseMessage DownloadFile([FromBody] string filePath)
{
    try
    {
        MemoryStream fileContent = new MemoryStream();
        if (File.Exists(filePath))
        {
            HttpResponseMessage response = new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content = new ByteArrayContent(File.ReadAllBytes(filePath))
            };
            response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
            response.Content.Headers.ContentDisposition.FileName = Path.GetFileName(filePath);
            response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");
            response.Content.Headers.ContentLength = new FileInfo(filePath).Length;
            return response;
        }
        else
            return Request.CreateResponse(HttpStatusCode.NotFound);
    }
    catch (Exception ex)
    {
        return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "The server failed to retrieve the file");
    }
}

Затем я перехватываю содержимое в службе-посреднике и передаю его внешнему интерфейсу в виде байтового массива:

fileFromServer = await response.Content.ReadAsByteArrayAsync();
return fileFromServer;

До этого момента все работало нормально. Я получаю байтовый массив и возвращаю его клиенту.

Далее у меня есть код сервиса и компонента, который должен сохранить это как файл:

 downloadFile(filename: string): Observable<Blob>{
   let headers = new Headers();
    headers.append('Content-Type', 'application/json; charset=utf-8');
    return this._http.post((this.baseUrl_GatewaySvc + 'downloadFiles'), JSON.stringify(filename), { headers: headers }).map(res => res.blob());
 }

И компонент:

import { saveAs as importedSaveAs } from 'file-saver';

 onDownloadFileClick(index: number): void {
    this._GatewaySvc.downloadFile('server-share-path' + this.Files[index].FileName).subscribe(
    fileFromServer => {
      $('#errorMsgModal').modal('show');
      $('#errMsgOnModal').text(fileFromServer);      
      var fileName = this.Files[index].FileName;
      importedSaveAs(fileFromServer, fileName);
      },
      error => { 
      $('#errorMsgModal').modal('show');
      $('#errMsgOnModal').text('Download finished' + error.status + ' ' + error.statusText); },
      () => {
        $('#errorMsgModal').modal('show');
        $('#errMsgOnModal').text('Download finished');
      }
    );
  }

Это входит в часть error, показывая следующий текст:

Загрузка завершена undefined undefined

Как правильно сохранить файл?

...