Search code examples
angulartypescriptfileblobangular-httpclient

Angular: How to download a file from HttpClient?


I need download an excel from my backend, its returned a file.

When I do the request I get the error:

TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.

My code is:

this.http.get(`${environment.apiUrl}/...`)
      .subscribe(response => this.downloadFile(response, "application/ms-excel"));

I tried get and map(...) but didn't work.

Details: angular 5.2

references:

import { HttpClient } from '@angular/common/http';
import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/finally';
import 'rxjs/add/operator/map'
import 'rxjs/add/operator/catch';

Content-Type of response:

Content-Type: application/ms-excel

What's wrong?


Solution

  • Try something like this:

    type: application/ms-excel

    /**
     *  used to get file from server
     */
    
    this.http.get(`${environment.apiUrl}`,{
              responseType: 'arraybuffer',headers:headers} 
             ).subscribe(response => this.downLoadFile(response, "application/ms-excel"));
    
    
        /**
         * Method is use to download file.
         * @param data - Array Buffer data
         * @param type - type of the document.
         */
        downLoadFile(data: any, type: string) {
            let blob = new Blob([data], { type: type});
            let url = window.URL.createObjectURL(blob);
            let pwa = window.open(url);
            if (!pwa || pwa.closed || typeof pwa.closed == 'undefined') {
                alert( 'Please disable your Pop-up blocker and try again.');
            }
        }