import { defHttp } from '@/utils/http/axios'; import { message } from 'ant-design-vue'; import * as streamSaver from "streamsaver" import { getToken } from '@/utils/auth'; import { useGlobSetting } from '@/hooks/setting'; const { apiUrl } = useGlobSetting(); /** * 下载文件 * @param url 文件路径 * @param fileName 文件名 * @param parameter * @returns {*} */ export const downloadFile = (url, fileName?, parameter?) => { return getFileblob(url, parameter).then((data) => { if (!data || data.size === 0) { message.warning('文件下载失败'); return; } if (typeof window.navigator.msSaveBlob !== 'undefined') { window.navigator.msSaveBlob(new Blob([data]), fileName); } else { let url = window.URL.createObjectURL(new Blob([data])); let link = document.createElement('a'); link.style.display = 'none'; link.href = url; link.setAttribute('download', fileName); document.body.appendChild(link); link.click(); document.body.removeChild(link); //下载完成移除元素 window.URL.revokeObjectURL(url); //释放掉blob对象 } }); }; export const downloadResource = async (url, fileName,parameter) =>{ url = apiUrl + url+"?path="+encodeURIComponent(parameter.path)+"&fileName="+parameter.fileName let filename = fileName if (!fileName) { filename = url.substring(url.lastIndexOf('/') + 1); } console.log(filename,'filename') return fetch(url, { method: 'GET', cache: 'no-cache', headers:{ Authorization: `Bearer ${getToken()}`, // clientId: clientId, }, }).then(res => { const fileStream = streamSaver.createWriteStream(filename,{ //增加小视图,体现下载进度条与总大小 size : res.headers.get("content-length") }) const readableStream = res.body if (window.WritableStream && readableStream.pipeTo) { return readableStream.pipeTo(fileStream) } window.writer = fileStream.getWriter() const reader = res.body.getReader() const pump = () => reader.read() .then(res => res.done ? window.writer.close() : window.writer.write(res.value).then(pump)) pump() }) } /** * 下载文件 用于excel导出 * @param url * @param parameter * @returns {*} */ export const getFileblob = (url, parameter) => { return defHttp.get( { url: url, params: parameter, responseType: 'blob', timeout: 1000 * 60 * 5, // 5分钟超时 }, { isTransformResponse: false } ); };