// tslint:disable import { NzMessageService } from 'ng-zorro-antd'; import { Directive, ElementRef, Input, HostListener } from '@angular/core'; import { HttpClient, HttpResponse, HttpHeaders } from '@angular/common/http'; import * as moment from 'moment'; import { saveAs } from 'file-saver'; import { _HttpClient } from '@core/services/http.client'; import { environment } from '../../../environments/environment'; /** * 文件下载 * * ```html * * ``` */ @Directive({ selector: '[down-file]' }) export class DownFileDirective { /** URL请求参数 */ @Input('http-data') httpData: any; /** 下载地址 */ @Input('http-url') httpUrl: string; /** 指定文件名,若为空从服务端返回的 `header` 中获取 `filename`、`x-filename` */ @Input('file-name') fileName: string; constructor( private el: ElementRef, private http: HttpClient, private _http: _HttpClient, private msgSrv: NzMessageService) { } @HostListener('click') _click() { this.el.nativeElement.disabled = true; this.http.get(environment.SERVER_URL + this.httpUrl, { params: this._http.parseParams(this.httpData || {}), // TODO: blob 并不会走TOKEN拦截器 headers: new HttpHeaders({ token: 'test' }), responseType: 'blob', observe: 'response' }).subscribe((res: HttpResponse) => { if (res.body.size <= 0) { this.msgSrv.error(`下载失败`, { nzDuration: 1000 * 3 }); return; } const fileName = this.fileName || res.headers.get('filename') || res.headers.get('x-filename'); saveAs(res.body, decodeURI(fileName)); this.msgSrv.success('下载成功'); }, (err) => { this.msgSrv.error(`下载失败,${err}`, { nzDuration: 1000 * 3 }); }, () => { this.el.nativeElement.disabled = false; }); } }