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