import { Injectable } from '@angular/core'; import { _HttpClient } from '@delon/theme'; import * as FileSaver from 'file-saver'; import { NzModalService } from 'ng-zorro-antd/modal'; @Injectable({ providedIn: 'root', }) export class EAFileUtil { constructor(private modal: NzModalService, private http: _HttpClient) {} /** * 保存文件 * @param content 需要保存的内容 * @param filename 文件名 * @param confirm 显示确认框 */ save(content: any, filename: string, confirm: boolean = true): void { const blob = new Blob([JSON.stringify(content)], { type: 'text/plain;charset=utf-8' }); if (confirm === true) { this.modal.confirm({ nzTitle: '文件下载确认', nzContent: `是否下载文件:${filename}`, nzOnOk: () => { FileSaver.saveAs(blob, filename); }, }); } else { FileSaver.saveAs(blob, filename); } } /** * @param url 接口地址 * @param body post请求参数 * @param params get请求参数 * @method 请求方法 */ download(url: string, body: any, params: any, method: 'POST' | 'GET' = 'POST'): void { if (method === 'POST') { this.http .post(url, body, params, { responseType: 'blob', observe: 'response', }) .subscribe((res) => { this.saveBlob(res); }); } else if (method === 'GET') { this.http .get(url, params, { responseType: 'blob', observe: 'response', }) .subscribe((res) => { this.saveBlob(res); }); } } /** * 创建blob对象,并利用浏览器打开url进行下载 * @param data 文件流数据 */ private saveBlob(res: any): void { const disp = res.headers.get('Content-Disposition'); const blob = new Blob([res.body], { type: 'text/plain;charset=utf-8' }); const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); const fileName = disp.split(';')[1].split('=')[1]; a.href = url; a.download = decodeURI(fileName); a.click(); window.URL.revokeObjectURL(url); } }