Signed-off-by: chy <chy@163.com>
This commit is contained in:
89
src/hooks/design/useAvueUpload.ts
Normal file
89
src/hooks/design/useAvueUpload.ts
Normal file
@@ -0,0 +1,89 @@
|
||||
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 }
|
||||
}
|
||||
Reference in New Issue
Block a user