import { Modal } from 'ant-design-vue' import { saveAs } from 'file-saver' import JSZip from 'jszip' /** * 弹窗填入文件名保存文件 * @param {Blob} data 数据 * @param {string} ext 扩展名,不带. */ export const showSaveFileModal = (data, ext) => { let fileName = '' const handleClick = event => { fileName = event.target.value } Modal.confirm({ title: 'Please enter file name', content: h => , okText: 'Cancle', cancelText: 'Save', okButtonProps: { style: { backgroundColor: '#b98326', color: '#fff', borderColor: 'transparent' } }, cancelButtonProps: { style: { color: '#fff', backgroundColor: '#31aab0', borderColor: 'transparent' } }, onOk() { console.log('Cancel') }, onCancel() { if (fileName) { saveAs(data, `${fileName}.${ext}`) } else { throw new Error() } } }) } /** * 读文件 * @param {File} file * @param { 'arrayBuffer' | 'text' | 'dataURL' | 'binaryString'} fileType */ export const readFile = (file, fileType = 'text') => { return new Promise((resolve, reject) => { const fileReader = new FileReader() const category = { arrayBuffer: 'readAsArrayBuffer', text: 'readAsText', dataURL: 'readAsDataURL', binaryString: 'readAsBinaryString' } fileReader[category[fileType]](file) fileReader.onload = event => { resolve(event.target.result) } fileReader.onerror = error => { reject(error) } }) } /** * 压缩文件 * @param {Array} fileList * @param {string} zipName * @returns */ export const zipFile = async (fileList, zipName) => { const zip = new JSZip() const promises = [] fileList.forEach(file => { promises.push(readFile(file, 'arrayBuffer')) }) const result = await Promise.all(promises) result.forEach(res => { zip.file(res.fileName, res.data) }) const content = await zip.generateAsync({ type: 'blob' }) return new File([content], zipName, { type: content.type }) }