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);
}
}