How to download an excel file in Angular 8 as an API response

后端 未结 6 2511
长发绾君心
长发绾君心 2021-02-16 00:27

I\'ve an API which returns an excel document as response. The request will be one simple json.

I\'ve searched google and found some code base to download the file and I

6条回答
  •  失恋的感觉
    2021-02-16 00:34

    While using { responseType: 'blob'} as said by most answers here works, I'd suggest using responseType: 'arraybuffer' instead of blob with observe: 'response'. Your call would then look like this:

    this.httpClient.get(resource, {
      headers: this.httpHeaders, // Any custom client side headers like Authorization
      observe: 'response',
      responseType: 'arraybuffer'
    });
    

    The advantage of this is two-fold:

    1. Arraybuffer is a generic stream of bytes and the Blob object can be created using either a blob or an arraybuffer, using the Content-Type
    2. observe: 'response' will also include the response headers that you set at the server in the parsed response.

    I use this method to put the filename and the MIME Type of the arraybuffer in the Content-Disposition and Content-Type response headers and then use a generic download service at the client-side.

    Also, I would suggest using a File object instead of just the Blob, which gives you the flexibility of giving it a filename like so:

    public downloadFile(response: any, fileName?: string) {
        const blob = new Blob([response.body], { type: response.headers.get('content-type') });
        fileName = fileName || response.headers.get('content-disposition').split(';')[0];
        const file = new File([blob], fileName, { type: response.headers.get('content-type') });
        saveAs(file);
    }
    

    This will also solve the problem that @knbibin raised about using a custom filename.

提交回复
热议问题