79 lines
2.0 KiB
JavaScript
79 lines
2.0 KiB
JavaScript
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 => <a-input onChange={handleClick} />,
|
|
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<File>} 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 })
|
|
}
|