import { request } from '@umijs/max'; /** MimeType */ export enum MimeType { XLSX = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ZIP = 'application/zip', JSON = 'application/json', } /** * 解析blob响应内容并下载 * @param res - blob响应内容 * @param mimeType - MIME类型 */ export function resolveBlob(res: any, mimeType: string, specifiedFileName: string = 'file') { const aLink = document.createElement('a'); const blob = new Blob([res.data], { type: mimeType }); // 从response的headers中获取filename, // 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名; const patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*'); // console.log(res); const contentDisposition = decodeURI(res.headers['content-disposition']); const result = patt.exec(contentDisposition); let fileName = result ? result[1] : specifiedFileName; fileName = fileName.replace(/"/g, ''); aLink.style.display = 'none'; aLink.href = URL.createObjectURL(blob); aLink.setAttribute('download', fileName); // 设置下载文件名称 document.body.appendChild(aLink); aLink.click(); URL.revokeObjectURL(aLink.href); // 清除引用 document.body.removeChild(aLink); } /** * 下载 Zip 文件 * @param url - url 地址 * @param options - 请求参数 */ export function downLoadZip(url: string, params?: any) { request(url, { method: 'GET', params, responseType: 'blob', getResponse: true, }).then((res) => { resolveBlob(res, MimeType.ZIP); }); } /** * 下载 XLSX 文件 * @param url - url 地址 * @param method - 请求方式 * @param options - 请求选项 */ export async function downloadXlsx( url: string, method: string = 'GET', options?: Record, ) { return request(url, { method: method, ...options, responseType: 'blob', getResponse: true, }).then((res) => { resolveBlob(res, MimeType.XLSX); }); } /** * 下载文本文件 * @param url - url 地址 * @param type - mime-type * @param fileName - 文件名 * @param method - 请求方法 * @param options - 请求选项 */ export function downloadCommonFile( url: string, type: string, fileName: string = 'file', method: string = 'GET', options?: Record, ) { request(url, { method: method, headers: { isToken: false, }, skipValidating: true, ...options, responseType: 'blob', getResponse: true, }).then((res) => { resolveBlob(res, type, fileName); }); }