89 lines
3.2 KiB
TypeScript
89 lines
3.2 KiB
TypeScript
import { downloadByUrl } from '@/utils/filt';
|
||
export default function (jsEnhanceObj?: Ref<any>) {
|
||
const { t } = useI18n() // 国际化
|
||
const message = useMessage() // 消息弹窗
|
||
|
||
//文件大小格式化
|
||
const fileSizeFormatter = (fileSize) => {
|
||
const unitArr = ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
|
||
fileSize = parseFloat(fileSize)
|
||
const index = Math.floor(Math.log(fileSize) / Math.log(1024))
|
||
fileSize = fileSize / Math.pow(1024, index)
|
||
//保留的小数位数
|
||
if (`${fileSize}`.indexOf('.') != -1) fileSize = fileSize.toFixed(2)
|
||
return fileSize + ' ' + unitArr[index]
|
||
}
|
||
|
||
//校验文件类型
|
||
const verifyFileType = (fileName) => {
|
||
const imgExp = /\.(gif|jpg|jpeg|png|webp|svg|GIF|JPG|JPEG|PNG|WEBP|SVG)/
|
||
const videoExp = /\.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|ogg|mp4)/
|
||
const audioExp = /\.(mp3|wav|MP3|WAV)/
|
||
if (imgExp.test(fileName)) return 'image/*'
|
||
if (videoExp.test(fileName)) return 'video/*'
|
||
if (audioExp.test(fileName)) return 'audio/*'
|
||
return false
|
||
}
|
||
|
||
const uploadBefore = async (file, done, loading, column) => {
|
||
let bool = false
|
||
if (column.controlType == 'image') {
|
||
if (column.accept == 'image/*' && verifyFileType(file.name) == column.accept) bool = true
|
||
else if (column.accept) {
|
||
const accept = column.accept instanceof Array ? column.accept : column.accept.split(',')
|
||
if (accept.includes(file.type)) bool = true
|
||
} else bool = true
|
||
}
|
||
if (column.controlType == 'file') {
|
||
if (column.accept) {
|
||
const nameList = file.name.split('.')
|
||
const suffix = `.${nameList[nameList.length - 1]}`
|
||
const accept = column.accept instanceof Array ? column.accept : column.accept.split(',')
|
||
|
||
accept.forEach(type => {
|
||
if (['image/*', 'video/*', 'audio/*'].includes(type) && verifyFileType(file.name) == type) bool = true
|
||
})
|
||
if (accept.includes(suffix) || accept.includes(file.type)) bool = true
|
||
} else bool = true
|
||
}
|
||
try {
|
||
if (column.verify) {
|
||
bool = await column.verify(file).then(() => true).catch(() => false)
|
||
}
|
||
} catch (error) { }
|
||
if (!bool) {
|
||
message.info(`请上传正确的${column.label}格式`)
|
||
loading()
|
||
return
|
||
}
|
||
try {
|
||
if (jsEnhanceObj?.value.beforeUpload) {
|
||
const isUpload = await jsEnhanceObj.value.beforeUpload(file)
|
||
if (!isUpload) {
|
||
loading()
|
||
return
|
||
}
|
||
}
|
||
} catch (error) {
|
||
console.warn(`'js增强【beforeUpload】方法执行异常,请检查'
|
||
${error}`)
|
||
}
|
||
done()
|
||
}
|
||
|
||
const uploadExceed = (limit, files, fileList, column) => {
|
||
message.info(`${column.label} 最大可上传 ${limit}${column.controlType == 'image' ? '张' : '件'}`)
|
||
}
|
||
const uploadSized = (fileSize, files, fileList, column) => {
|
||
fileSize = fileSizeFormatter(fileSize)
|
||
message.info(`${column.label} 上传大小不可超过 ${fileSize}`)
|
||
}
|
||
const uploadPreview = (file, column, done) => {
|
||
if (column.controlType == 'image') return done()
|
||
const bool = verifyFileType(file.url)
|
||
if (bool) done()
|
||
else downloadByUrl({ url: file.url })
|
||
}
|
||
|
||
return { uploadBefore, uploadExceed, uploadSized, uploadPreview }
|
||
} |